Response.Write () в WebService - PullRequest
       14

Response.Write () в WebService

9 голосов
/ 18 декабря 2011

Я хочу вернуть данные JSON клиенту, используя метод веб-службы. Один из способов - создать SoapExtension и использовать его в качестве атрибута в моем веб-методе и т. Д. Другой способ - просто добавить атрибут [ScriptService] в веб-сервис и позволить .NET Framework вернуть результат в виде {"d": "something"} JSON, назад пользователю (d здесь что-то вне моего контроля). Тем не менее, я хочу вернуть что-то вроде:

{"message": "action was successful!"}

Самым простым подходом может быть написание такого веб-метода, как:

[WebMethod]
public static void StopSite(int siteId)
{
    HttpResponse response = HttpContext.Current.Response;
    try
    {
        // Doing something here
        response.Write("{{\"message\": \"action was successful!\"}}");
    }
    catch (Exception ex)
    {
        response.StatusCode = 500;
        response.Write("{{\"message\": \"action failed!\"}}");
    }
}

Таким образом, то, что я получу у клиента:

{ "message": "action was successful!"} { "d": null}

Это означает, что ASP.NET добавляет результат своего успеха в мой результат JSON. Если, с другой стороны, я сбрасываю ответ после написания сообщения об успехе (например, response.Flush();), происходит исключение, которое говорит:

Сервер не может очистить заголовки после отправки заголовков HTTP.

Итак, что нужно сделать, чтобы получить результат JSON, не меняя подход?

Ответы [ 2 ]

12 голосов
/ 09 ноября 2013

Это работает для меня:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void ReturnExactValueFromWebMethod(string AuthCode)
{
    string r = "return my exact response without ASP.NET added junk";
    HttpContext.Current.Response.BufferOutput = true;
    HttpContext.Current.Response.Write(r);
    HttpContext.Current.Response.Flush();
}
2 голосов
/ 06 ноября 2012

Почему бы вам не вернуть объект, а затем в вашем клиенте вы можете позвонить как response.d?

Я не знаю, как вы вызываете свой веб-сервис, но я привел пример с некоторыми предположениями:

Я сделал этот пример, используя jquery ajax

function Test(a) {

                $.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    url: "TestRW.asmx/HelloWorld",
                    data: "{'id':" + a + "}",
                    dataType: "json",
                    success: function (response) {
                        alert(JSON.stringify(response.d));

                    }
                });
            }

И ваш код может выглядеть следующим образом (сначала необходимо разрешить вызов веб-службы из сценария: '[System.Web.Script.Services.ScriptService]'):

    [WebMethod]
    public object HelloWorld(int id)
    {
        Dictionary<string, string> dic = new Dictionary<string, string>();
        dic.Add("message","success");

        return dic;
    }

В этом примере я использовал словарь, но вы можете использовать любой объект с полем «сообщение», например.

Извините, если я неправильно понял, что вы имели в виду, но я не совсем понимаю, почему вы хотите сделать ответную вещь.

Надеюсь, я хотя бы помог. :)

...