WCF проследяване хвърля XML изключение, срещна неочакван знак 'j' при функция за повикване, използвайки JSONP

Имам WCF услуга с функция, наречена GetTrackingLink:

[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>

...and after each call to GetTrackingLink, I find in RAFProdTraces2.svclog the following error: System.Xml.XmlException: Encountered unexpected character 'j'.

Знам, че това се случва, защото JSONP изпраща обратното извикване със заявката, която изглежда така:

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

Следователно „j“ от „jQuery“ кара диагностиката на WCF да хвърли изключение (това е „j“, защото го замених с други знаци многократно и новите хвърлени изключения имаха знаците, които използвах, за да заменя „j“ с ).

Въпросът ми е има ли някакъв начин да накарам системната диагностика да анализира правилно заявката и да игнорира частта "callback=jQuery1102024896297114901245_1383152659468"?

Или има някакъв друг начин да се отървете от това изключение?

Благодаря ви предварително.


person Dog    schedule 31.10.2013    source източник


Отговори (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 низ с обвивката за обратно извикване и няма да има оплаквания за форматиране. Надявам се това да помогне на няколко души с този проблем.

Харел

person Harel Seligmann    schedule 04.08.2014