我整天都在敲这个,是时候寻求帮助了。我正在尝试从一些 .net 代码调用 .net MVC WebAPI 应用程序。我从 WebAPI 收到状态代码 500,但没有任何真实信息,即使将错误详细信息策略设置为“始终”也是如此。所以我打开了 Fiddler,现在我至少可以看到更多。这是我从 .net 调用后通过 Fiddler 从 IIS 收到的内容:
{"Message":"发生错误。","ExceptionMessage":"用户凭据无效。","ExceptionType":"System.Exception","StackTrace":" at RemoteManagementService.Controllers.ProvisioningController.PostLogOn(RequestModel `1 个请求)等...
(堆栈跟踪引用我的操作方法的右括号作为错误行)
.net HttpClient 调用代码:
this.DefaultRequestHeaders.Add("Origin", "http://localhost:1181");
this.DefaultRequestHeaders.Referrer = new Uri("http://localhost:1181/Provisioner/Edit/1");
//this.PostAsync<RequestModel<string>>(address + "PostLogOn", request, new media JsonMediaTypeFormatter())
this.PostAsync<RequestModel<string>>(address + "PostLogOn", request, new XmlMediaTypeFormatter())
.ContinueWith(
(postTask) =>
{
postTask.Result.Content.ReadAsAsync<string>().ContinueWith(
(readTask) =>
{
myvalue = readTask.Result;
}).Wait();
}).Wait();
jquery调用代码:
jQuery.support.cors = true;
$.ajax({
type: 'POST',
url: 'http://me.mywebsite.com/provisioning/api/provisioning/PostLogOn',
datatype: 'json',
data: { datum: 'this is my data' },
success: function (data) {
alert(data);
},
error: function (data) {
alert(data);
}
});
真正让我感到沮丧的是,当我使用 jquery 进行相同的调用时,我似乎能够启动控制器操作(我仍然收到错误,但那是因为我无法从我的 html 以有效的方式格式化 RequestModel<> page 并在成功进入方法后收到解析异常)
来自 chrome 的 jquery 请求:
POST /provisioning/api/provisioning/PostLogOn HTTP/1.1
Host: me.mywebsite.com
Connection: keep-alive
Content-Length: 21
Origin: http://localhost:1181
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.92 Safari/537.4
Content-Type: application/x-www-form-urlencoded
Accept: */*
Referer: http://localhost:1181/Provisioner/Edit/1
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
.net HttpClient 请求:
POST /provisioning/api/provisioning/PostLogOn HTTP/1.1
Accept: application/json
Origin: http://localhost:1181
Referer: http://localhost:1181/Provisioner/Edit/1
Content-Type: application/xml; charset=utf-8
Host: me.mywebsite.com
Content-Length: 420
Expect: 100-continue
Connection: Keep-Alive
为了更好地衡量,我收到的响应(jquery 和 .net 之间的唯一区别是大小)
HTTP/1.1 500 Internal Server Error
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/7.5
Access-Control-Allow-Origin: http://localhost:1181
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 10 Oct 2012 06:34:46 GMT
Content-Length: 823
我的控制器或操作没有任何授权属性。我有一个会话密钥,但它没有集成到我的框架中,只是作为我的 RequestModel<> 一部分的数据。当我从 VS 以调试模式运行应用程序时,一切正常。这仅在我将 WebAPI 部署到我的网站后才会发生。在我将 cors Origin 处理程序添加到我的 API 配置启动中后,jQuery 调用开始工作,这让我认为这是一个跨域问题,但是 .net 代码具有相同的源头......我看到的最大区别是即使我指定了 json 数据类型,ajax 调用最终也会将事物格式化为 form-urlencoded。我已经尝试了.net 中的 json 和 xml 都无济于事。我也尝试过 UrlEncodedMediaTypeFormatter,但它显然不够聪明,无法序列化我的数据。有趣的是,如果我在测试操作上尝试从浏览器 URL 栏中进行简单的 GET,我也可以得到响应。我是否需要告诉 HttpClient 我要跨域类似于 jQuery.support.cors = true 以某种方式?
任何建议或见解将不胜感激,因为我已经达到了我的 Google 技能和个人知识的极限。