【发布时间】:2011-01-10 05:59:50
【问题描述】:
这个真的很简单,运行这个 Silverlight4 示例并注释掉 ContentType 属性,您将从我的服务以 xml 形式返回响应。现在取消注释该属性并运行它,您将得到一个 ProtocolViolationException,应该发生的是服务返回 JSON 格式的数据。
#if DEBUG
Address = "http://localhost.:55437/Services/GetFoodDescriptionsLookup(2100)";
#else
Address = "http://stephenpattenconsulting.com/Services/GetFoodDescriptionsLookup(2100)";
#endif
Uri httpSite = new Uri(Address);
HttpWebRequest wreq =
(HttpWebRequest)WebRequestCreator.ClientHttp.Create(httpSite);
//wreq.ContentType = "application/json"; // Wrong
wreq.Accept = "application/json"; // Right
wreq.BeginGetResponse((cb) =>
{
HttpWebRequest rq = cb.AsyncState as HttpWebRequest;
HttpWebResponse resp = rq.EndGetResponse(cb) as HttpWebResponse; // Exception
StreamReader rdr = new StreamReader(resp.GetResponseStream());
string result = rdr.ReadToEnd();
rdr.Close();
}, wreq);
新异常
System.NotSupportedException 未被用户代码处理 消息="" 堆栈跟踪: 在 System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod,对象状态) 在 System.Net.Browser.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 在 com.patten.silverlight.ViewModels.WebRequestLiteViewModel.b_0(IAsyncResult cb) 在 System.Net.Browser.BrowserHttpWebRequest.c_DisplayClassd.b__b(Object state2) 在 System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(对象状态) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback 回调,对象状态,布尔 ignoreSyncCtx) 在 System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem() 在 System.Threading.ThreadPoolWorkQueue.Dispatch() 在 System.Threading.ThreadPoolWaitCallback.PerformWaitCallback() 内部异常:System.NotSupportedException Message=不支持指定的方法。 堆栈跟踪: 在 System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 在 System.Net.Browser.BrowserHttpWebRequest.c_DisplayClass5.b_4(Object sendState) 在 System.Net.Browser.AsyncHelper.c_DisplayClass2.b__0(对象 sendState) 内部异常:
现在工作
我得到的异常是由于我用来让 Fiddler 显示环回适配器的 hack,即 http://localhost.:55437/Services/GetFoodDescriptionsLookup(2100),请注意单词 localhost 后面的额外点。
就是这样!
我知道每个人都在想什么,这本来可以解决的认为问题出在网络堆栈中。艰难的教训。
感谢所有花时间参与此项目的人,无论是在 stackoverflow 上还是在离线状态。
为了完整起见,我添加了 jQuery 函数,这让我一直认为我需要在 SL4 应用程序中设置“内容类型”而不是“接受”。 (阅读文档!)
function CallService(serviceUrl, data, callback) {
$.ajax({
url: serviceUrl,
data: data,
dataType: 'json',
contextType: "application/json",
cache: false,
success: callback,
error: function (msg) {
alert("Request Failed!");
}
});
}
【问题讨论】:
-
请发布来自 Fiddler 的请求和响应标头;另外,究竟是什么异常?我的意思是,消息和内部异常是什么。
-
您编辑中的新异常是否与您在上面发布的代码完全相同?因为我试过了,它没有任何问题,所以我很惊讶。发生这种情况时,您能否发布您的 Silverlight 应用程序调用的 Fiddler 日志? (即不是在 Fiddler 中创建的手动请求)。如果您跨域使用此 Web 服务(因为不存在策略文件),该位置会出现异常,但您发布的异常不会出现,所以我认为这不是问题;只是为了确定-您的客户端应用程序也在同一个域上吗? (stephenpattenconsulting.com)
-
是的,创建HttpWebResponse时抛出异常。
标签: silverlight wcf json httpwebrequest