Webmethods в веб-сервисе и статические методы
Уважаемые эксперты,
Это может быть очень глупый вопрос, но я в замешательстве.
У меня есть веб-служба, которая имеет много веб-методов (объявленных с атрибутом [WebMethod])
Все эти службы выполняют бизнес-логику, взаимодействуют с базой данных и создают пользовательский объект класса со значениями, присвоенными его свойствам в качестве значений ответа.
Я должен преобразовать объект в JSON и вернуться к клиенту.
У меня есть статический метод в статическом классе ReturnResponseToClient as;
public static class GlobalUtilities { public static string ReturnResponseToClient(string response, HttpContext currentContext) { context.Response.Clear(); context.Response.ContentType = "application/json; charset=utf-8"; context.Response.Write(response); context.Response.Flush(); context.Response.End(); } }
Вышеприведенный метод вызывается в конце каждого [WebMethod] в веб-службе, которая затем возвращает ответ клиенту. Я сделал это так, что мне не нужно писать 5 строк кода в каждом [WebMethod]s в каждом веб-сервисе.
[WebMethod] public void Login(User u) { // .. do the database activities and other business logic // .. response object is ready GlobalUtilities.ReturnResponseToClient(JsonConvert.SerialiseObject(responseObject), HttpContext.Current); }
Вопрос в том:
Это может работать для одного использования во время разработки, но я подозреваю, что это определенно приведет к сбою, когда несколько пользователей используют систему и один и тот же веб-сервис с разными параметрами. Это происходит потому, что он статичен и может перезаписать входные параметры, пока выполняется другой вызов. Это верно? Если да, то что с этим можно сделать?
Что я уже пробовал:
Я попытался создать обычный публичный класс и публичный метод внутри него, чтобы каждый раз, когда я хочу отправить ответ клиенту, я мог создать объект этого публичного класса, а затем получить доступ к методу через этот объект. Таким образом, все вызовы этого метода остаются независимыми и не перезаписывают фактический ответ
[WebMethod] public void Login(User u) { // .. do the database activities and other business logic // .. response object is ready GlobalUtilities gu = new GlobalUtilities(); gu.ReturnResponseToClient(JsonConvert.SerialiseObject(responseObject), HttpContext.Current); }
Все вышесказанное, конечно, сработает, когда я создам нестатический класс.
Если есть какой-то другой способ добиться этого, пожалуйста, помогите мне.
Спасибо.
Karthik_Mahalingam
почему вы используете [WebMethod] для класса?
Nayan Ambaliya
Извини, это была моя вина. Я изменил и улучшил вопрос.
Не могли бы вы случайно пролить свет на это?
Спасибо.
Richard Deeming
Я был бы склонен сделать это метод расширения[^] на HttpResponse
класс и включить сериализацию JSON в метод.
Вы должны избегать использования Response.End
, так как это бросает ThreadAbortException
, и предназначен только для обратной совместимости с "классическим" ASP.
И если вы наследуете от WebService
, вы можете использовать его Контекст[^] свойство для получения ассоциированного HttpContext
, а не использовать HttpContext.Current
.
public static class GlobalUtilities { public static void ReturnJson(this HttpResponse response, object result) { string json = JsonConvert.SerialiseObject(result); response.Clear(); response.ContentType = "application/json; charset=utf-8"; response.Write(json); response.Flush(); } } ... [WebMethod] public void Login(User u) { // .. do the database activities and other business logic // .. response object is ready Context.Response.ReturnJson(responseObject); }
Nayan Ambaliya
Это хорошо. Я всегда склоняюсь к тому, как создавать такие утилитарные методы и использовать их в коде.
Спасибо.