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'”的主要内容,如果未能解决你的问题,请参考以下文章