2011-12-18 37 views
9

Tôi muốn trả lại dữ liệu JSON về máy khách, trong phương thức dịch vụ web của tôi. Một cách là tạo ra SoapExtension và sử dụng nó làm thuộc tính trên phương pháp web của tôi, v.v. Một cách khác là chỉ cần thêm thuộc tính [ScriptService] vào dịch vụ web và để cho khuôn khổ .NET trả lại kết quả dưới dạng {"d": "something"} JSON, quay lại người dùng (d tại đây là điều gì đó ngoài tầm kiểm soát của tôi). Tuy nhiên, tôi muốn quay trở lại một cái gì đó như:Response.Write() trong WebService

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

Phương pháp đơn giản nhất có thể viết một phương pháp web như:

[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!\"}}"); 
    } 
} 

Bằng cách này, những gì tôi sẽ nhận được ở khách hàng là:

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

Điều đó có nghĩa là ASP.NET đang thêm kết quả thành công vào kết quả JSON của tôi. Nếu mặt khác tôi tuôn ra những câu trả lời sau bằng văn bản thông báo thành công, (như response.Flush();), ngoại trừ xảy ra mà nói:

Server có thể không tiêu đề rõ ràng sau khi tiêu đề HTTP đã được gửi đi.

Vì vậy, phải làm gì để nhận kết quả JSON của tôi mà không thay đổi cách tiếp cận?

+0

Hãy thử thiết lập response.BufferOutput = true; –

Trả lời

2

Tại sao bạn không trả lại đối tượng và sau đó trong ứng dụng khách, bạn có thể gọi là response.d?

Tôi không biết làm thế nào bạn đang gọi dịch vụ Web của bạn, nhưng tôi đã làm một ví dụ làm cho một số giả định:

tôi làm ví dụ này sử dụng 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)); 

        } 
       }); 
      } 

Và mã của bạn có thể là như thế này (bạn cần phải cho phép các dịch vụ web để được gọi từ kịch bản đầu tiên: '[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; 
    } 

Trong ví dụ này tôi sử dụng từ điển nhưng yo u có thể sử dụng bất kỳ đối tượng với một trường "tin nhắn" ví dụ.

Tôi xin lỗi nếu tôi hiểu sai ý của bạn nhưng tôi thực sự không hiểu tại sao bạn muốn làm một điều 'response.write'.

Hy vọng tôi đã giúp ít nhất. :)

10

này làm việc cho tôi:

[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(); 
} 
+1

dòng này đã giúp tôi, nhưng đối với tôi tôi đã thêm những dòng này để làm cho nó hoạt động Response.Flush(); Response.End(); –

+1

ResponseEnd() gây ra “Chủ đề đã bị hủy bỏ” Điều này phù hợp với tôi! HttpContext.Current.Response.Flush(); HttpContext.Current.Response.SuppressContent = true; HttpContext.Current.ApplicationInstance.CompleteRequest(); http://stackoverflow.com/questions/20988445/how-to-avoid-response-end-thread-was-being-aborted-exception-during-the-exce – Evilripper

Các vấn đề liên quan