0

GetTrackingLink という名前の関数を持つ WCF サービスがあります。

[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public BasicResponse GetTrackingLink(string orderID)
{
    BasicResponse response = new 
    if (orderID == null)
        response.Status = "null";
    else
        response.Status = "not null";
    return response;
}

次のスクリプトを使用して、別のページからこの関数を呼び出します。

$.ajax({
type: 'GET',
url: 'http://localhost:14113/Service1.svc/GetTrackingLink',
crossDomain: true,
global: true,
dataType: 'jsonp',
data: {
"orderID": "006-0000001"        
},
success: function (result) {
console.log("success");
},
error: function (result) {
console.log("error");
}
};

呼び出しは問題なく、データは GetTrackingLink に正しく送信されます。問題は、次の構成を使用して WCF トレースをアクティブにしたことです。

<system.diagnostics>
<sources>
  <source name="System.ServiceModel" switchValue="Critical, Error, Warning, Information, ActivityTracing" propagateActivity="true">
    <listeners>
      <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\inetpub\logs\RAFProdTraces2.svclog"></add>
    </listeners>
  </source>
  <source name="System.ServiceModel.MessageLogging">
    <listeners>
      <add name="messages" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\inetpub\logs\RAFProdTracesMessages2.svclog" />
    </listeners>
  </source>
</sources>

...そして、GetTrackingLink を呼び出すたびに、RAFProdTraces2.svclog に次のエラーが見つかりました: System.Xml.XmlException: 予期しない文字 'j' に遭遇しました。

これは、JSONP が次のようなリクエストでコールバックを送信するために発生することがわかっています。

GET /Service1.svc/GetTrackingLink?callback=jQuery1102024896297114901245_1383152659468&orderID=006-0000001

したがって、「jQuery」の「j」により、WCF 診断で例外がスローされます (「j」を他の文字に繰り返し置き換えたため、新しくスローされた例外には、「j」を置き換えるために使用した文字が含まれていたためです) )。

私の質問は、システム診断でリクエストを正しく解析し、「callback=jQuery1102024896297114901245_1383152659468」の部分を無視する方法はありますか?

または、この例外を取り除く他の方法はありますか?

前もって感謝します。

4

1 に答える 1

1

あなたがこれを送ってから何ヶ月も経っていることは知っていますが、返信がなく、他の人も同じ問題を抱えていると確信しているため、問題に対する私の解決策は次のとおりです.

WCF が返された json を好まないため、問題が発生する理由。問題は、返される json が次のようなものになることです。

jQuery1102024896297114901245_1383152659468([{"PropertyTypeCode":"Unit","PropertyType":"Unit / Tower Block"}]) 

ラッパーとしてコールバック関数を使用します。私がやったことは、プログラムでjsonを作成し、データをストリームとして返すための回避策を構築して、wcfがフォーマットを気にしないようにすることです。

したがって、関数は次のようになります。

System.IO.Stream GetTrackingLink(string callback, string countryCode ...)

次に、オブジェクトが「応答」の場合、関数で:

string jsonClient = GetJsonString(response, callback);
WebOperationContext.Current.OutgoingResponse.ContentType = "application/json; charset=utf-8";
return new MemoryStream(Encoding.UTF8.GetBytes(jsonClient));

そして機能:

private string GetJsonString(object myObject, string callback)

    {
        var s = new JavaScriptSerializer();
        return callback + "(" + s.Serialize(myObject) + ")";
    }

次に、WCF はコールバック ラッパーを使用して json 文字列を返し、書式設定に関する問題はありません。これがこの問題で数人の人に役立つことを願っています.

ハレル

于 2014-08-04T07:04:51.927 に答える