2011-12-18 6 views
9

私のWebサービスメソッドで、JSONデータをクライアントに返す必要があります。 1つの方法は、SoapExtensionを作成し、それを私のWebメソッドなどの属性として使用することです。もう1つの方法は、[ScriptService]属性をWebサービスに追加して、.NETフレームワークが結果を{"d": "something"} JSONとして返すようにすることです(dここ私のコントロールから何かである)。しかし、私は何か返したい:WebServiceのResponse.Write()

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

最も簡単な方法は次のようにWebメソッドを書くことができます:

[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();など)を書き込んだ後に応答をフラッシュする場合は、例外が言うことが起こる:

Serverは、HTTPヘッダの後の明確なヘッダが送信されていることができません。

アプローチを変更せずにJSON結果を取得するにはどうすればよいですか?

+0

は真response.BufferOutput =を設定してみてください。 –

答えて

2

オブジェクトを返してからクライアントに返さないと、response.dと呼びますか?

私はあなたのWebサービスを呼び出しているかわからないが、私はいくつかの仮定を作る例を作った:

私は

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)); 

        } 
       }); 
      } 

jqueryのAJAXを使用してこの例を作り、あなたのコードは次のように可能性があり(あなたは、Webサービスは、最初のスクリプトから呼び出すことができるようにする必要があります:「[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; 
    } 

私は辞書が、ヨーヨーを使用しましたたとえば、フィールド "message"を持つオブジェクトを使用することができます。

私はあなたが何を意味したのか分からなかったのは残念ですが、なぜあなたは 'response.write'のことをしたいのか分かりません。

私は少なくとも助けてくれました。 :)

10

これが私の作品:

[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

この行は私を助けましたが、私にとってはこれらの行を追加して動作させました。 Response.Flush(); Response.End(); –

+1

ResponseEnd()が原因で「スレッドが中止されました」 これは私のために機能します! 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