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 回答