Nayan Ambaliya Ответов: 1

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

Это хорошо. Я всегда склоняюсь к тому, как создавать такие утилитарные методы и использовать их в коде.

Спасибо.

1 Ответов

Рейтинг:
1

Karthik_Mahalingam

Цитата:
Это может работать для одного использования во время разработки, но я подозреваю, что это определенно приведет к сбою, когда несколько пользователей используют систему и один и тот же веб-сервис с разными параметрами. Это происходит потому, что он статичен и может перезаписать входные параметры, пока выполняется другой вызов. Это верно?

Нет,
Это true в случае с static variable не static method


Nayan Ambaliya

Означает ли это, что множественные вызовы статического метода разными клиентами с входными переменными (как в вопросе) не будут перезаписывать значение входной переменной, а также HttpResponse как внутри метода?

Karthik_Mahalingam

это не отменит.