Трассировка 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