WCF 跟踪在使用 JSONP 的调用函数上引发 XML 异常“遇到意外字符'j'”

Posted

技术标签:

【中文标题】WCF 跟踪在使用 JSONP 的调用函数上引发 XML 异常“遇到意外字符\'j\'”【英文标题】:WCF Tracing throws XML Exception "encountered unexpected character 'j'" on call function using JSONPWCF 跟踪在使用 JSONP 的调用函数上引发 XML 异常“遇到意外字符'j'” 【发布时间】:2013-11-11 09:13:28 【问题描述】:

我有一个带有名为 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: Encountered unexpected character 'j'。

我知道会发生这种情况,因为 JSONP 会随请求发送回调,如下所示:

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

因此,'jQuery' 中的 'j' 导致 WCF 诊断抛出异常(就是那个 'j',因为我用其他字符重复替换了它,并且新抛出的异常具有我用来替换 ' 的字符j' 与)。

我的问题是,有什么方法可以让系统诊断正确解析请求并忽略“callback=jQuery1102024896297114901245_1383152659468”部分?

或者有没有其他方法可以摆脱这个异常?

提前谢谢你。

【问题讨论】:

【参考方案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 字符串,并且没有任何格式投诉。希望这可以帮助一些人解决这个问题。

哈雷尔

【讨论】:

以上是关于WCF 跟踪在使用 JSONP 的调用函数上引发 XML 异常“遇到意外字符'j'”的主要内容,如果未能解决你的问题,请参考以下文章

WCF:使用 JSONP 将来源列入白名单

WCF + JSONP:总是收到“方法不允许”错误消息

使用 WCF .NET3.5 的跨域调用/JSONP

调用 WCF 服务时 JSONP 自动完成失败

WCF 跨域使用 Jsonp 错误未捕获语法错误:意外令牌:

配置 WCF JSONP 和 SOAP 端点侦听同一 URI