【问题标题】:Put Request in chrome is not binding DTO将请求放入 chrome 未绑定 DTO
【发布时间】:2016-03-12 11:37:18
【问题描述】:

我遇到了奇怪的问题,虽然花了很多时间但仍然无法解决

之前提出的请求运行良好,但我遇到了问题

加载资源失败:服务器响应状态为 404(未找到) fontawesome-webfont.woff2?v=4.3.0

我通过添加解决了它

<staticContent>
  <remove fileExtension=".woff" />
  <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
  <remove fileExtension=".woff2" />
  <mimeMap fileExtension=".woff2" mimeType="font/x-woff" />
</staticContent>

虽然它解决了这个问题,但是我的 put 方法在挠头后没有工作我开始知道它没有将模型绑定到我的 DTO 尽管 ModelState.IsValid == true 但我的 DTO 模型为 null 并且这只发生在 put请求所有其他请求都可以正常工作,例如 get、getall、delete、post,这仅在 chrome 中发生。在 Firefox 中放置请求工作正常。

我无法理解 ModelState 是否为真,那么为什么 chrome 没有将数据绑定到我的 DTO 以下分别是 chrome 和 Firefox 的标头请求

PUT /api/AddressTypeAPI/1 HTTP/1.1
Host: localhost:xxxx
Connection: keep-alive
Content-Length: 194
Accept: application/json, text/plain, */*
Origin: http://localhost:xxxx
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Authorization: Bearer xxxx
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:xxxx/AddressType/Index
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8

火狐

Host: localhost:xxxx
Connection: keep-alive
Content-Length: 179
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0
Authorization: Bearer xxxx
Content-Type: application/json;charset=utf-8
Referer: http://localhost:xxxx/AddressType/Index
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5

我想知道为什么内容长度不同

以下是所需的详细信息

我调用 webapi 的 Angular JS 函数

 service.put = function (ID, DataBundle) {
    var request = $http({
        method: "put",
        url: url + "/" + ID,
        data: { DataBundle: DataBundle }
    }).catch(exceptionHandler);
    return request;
}

DataBundle-->
Active:"Y"
Code:"0002"
CreateDate:null
CreateUser:null
Description:"Office Address"
ID:2
ModifyDate:"2015-10-19T02:15:06.6241496"
ModifyUser:1
Name:"Office"
__proto__:Object

来自 chrome 的 put 请求的服务器端代码 enter image description here

DTO 类绑定传入模型

public class ParamDTO
    {
        public int ID { get; set; }
        public string Code { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public string Active { get; set; }
        public Nullable<int> CreateUser { get; set; }
        public Nullable<System.DateTime> CreateDate { get; set; }
        public Nullable<int> ModifyUser { get; set; }
        public Nullable<System.DateTime> ModifyDate { get; set; }
        public bool Deleted { get; set; }
        public Nullable<int> UserLevelID { get; set; }
        public string StatusType { get; set; }
    }

【问题讨论】:

  • 您能否将 Firefox 和 Chrome 的请求正文添加到您的问题中?除此之外,动作方法的签名和该签名中使用的类也会很有帮助。
  • 你说的是JS的调用方式吗?您是否认为这些标头有很大差异?我的意思是导致通过 chrome 发出请求的原因是它没有将数据绑定到我的 DTO。等等,让我把所有你容易理解的截图都拍下来
  • 我说的是 HTTP 请求的主体。目前您只添加了标题。添加请求的正文可能会解释为什么内容长度不同的问题。接下来,添加接收 PUT 的 ApiControllers 方法的签名有助于调查为什么 ModelState 有效但 DTO 为空。
  • 抱歉搞砸了,我试图以图片形式描述它,但我无法发布更多图片。两个请求的数据包相同(即如果请求来自 Firefox,则来自 chrome 和 firefox 模型的绑定值与 databundle 相同)如果您需要更多信息,请告诉我
  • 我仍然想查看请求的正文。您是否安装了Fiddler?启动它,从 Firefox 和 Chrome 执行完全相同的请求(例如,将相同的 DataBundle 放入localhost:yourport/api/AddressTypeAPI/1)。从 Fiddler 检索这些请求的正文并将它们添加到您的问题中。

标签: google-chrome firefox asp.net-web-api2 put dto


【解决方案1】:

搞定了 我的 angularJS 调用函数有问题 这一行

data: { DataBundle: DataBundle }

应该是

 data: DataBundle 

我不确定为什么它有时会与 Firefox 一起使用。如果有人可以贡献解释这一点,那将不胜感激

【讨论】:

    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2023-01-07
    • 2022-11-01
    • 1970-01-01
    • 2014-06-11
    • 2021-03-05
    • 2022-01-16
    • 2019-06-01
    相关资源
    最近更新 更多