1

我整天都在敲这个,是时候寻求帮助了。我正在尝试从一些 .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 技能和个人知识的极限。

4

2 回答 2

1

我设法解决了我的问题。tugberk 是正确的,因为它是我的代码中的一个问题。我最初的跨域假设是正确的,当我将 cors 消息处理程序添加到我的 api 配置时,问题得到了解决,这也是我最终能够得到错误消息的原因。

我获得无效凭据的原因是,当我在开发机器上运行时连接字符串查找(注册表)可用,但在部署到 IIS 服务器后不可用。成功部署到完全配置的 beta 环境。我的困惑源于最初的跨域问题和 14 小时的问题诊断。

于 2012-10-10T18:04:12.690 回答
1

或从您的方法或 api 控制器中删除授​​权属性,或将 allowAnonymous 属性添加到您的 api 方法

[AllowAnonymous]
[HttpPost]
public HttpResponseMessage PostLogOn(string datum)
{
   return Request.CreateResponse(HttpStatusCode.OK);
}
于 2015-11-18T07:39:51.863 回答