【问题标题】:RESTful .net - POST without Content-TypeRESTful .net - 没有 Content-Type 的 POST
【发布时间】:2013-01-16 01:43:27
【问题描述】:

是否可以让 Web 服务接受没有内容类型标头的 json 格式的请求?

当我传递 Content-type: application/json 标头时,POST 动词效果很好。如果不这样做,则会引发 400 错误。我在这里遇到了很多问题,询问他们为什么要退回 400,答案是内容类型。那么服务器端是否可以代表用户“填写”?

【问题讨论】:

    标签: c# .net json rest


    【解决方案1】:

    如果没有某种内容头来告诉它如何解释请求,默认的 .NET webstack 是不可能这样做的。如果您想进入 ASP.NET 堆栈的内部(您可以使用反射器应用程序,例如 ILSpy),您可能会找到一个拦截点,但您很可能必须进行一些自定义 IIS 集成才能获取该模块拦截请求,甚至可能在涉及 ASP.NET 堆栈之前。

    对于大多数人来说,让 JSON 请求应用程序引入标头要容易得多。

    此外,我鼓励你开始学习如何使用 Reflector 来探索这些堆栈是如何工作的,它们确实很复杂,而且很大而且可扩展性很高,但代价是工程成本(现在大胆猜测说没有经验的 IIS 开发人员需要如果可以巧妙地完成这项技术,大约需要 50 小时来设计此技术)。

    【讨论】:

    • 我将不得不调查 ILSpy 和 Relector。看起来客户端可以毫无问题地使用内容类型,所以幸运的是我这次不必将任何这些付诸实践。好东西要知道。谢谢!
    【解决方案2】:

    您使用的是 WebAPI 还是 ASP.NET MVC?我有一个解决方案给你,虽然有些人可能会对我大喊大叫。

    • 您可以创建一个属性,尝试将请求的主体反序列化为您正在寻找的特定操作的对象。如果它有效,那么您可以使用 RequestContext 将其传递给参数列表。我不知道你需要设置哪些确切的属性,但我记得在 ASP.NET MVC 中做了一些非常相似的事情。

    希望对您有所帮助。

    附:使用 JSON.Net,它有很多有用的反序列化方法,让这一切变得轻而易举。

    【讨论】:

    • 您确定在这种情况下该属性实际上会被调用吗?似乎服务器在到达那部分代码之前就拒绝了它。
    • 400 表示请求错误。此外,在您放置内容类型之后它可以工作的事实让我认为它在某种程度上击中了您的代码。即使它没有涉及到您的方法/操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 2013-06-09
    • 1970-01-01
    相关资源
    最近更新 更多