【问题标题】:Testing API Post passing a <Frombody()> class - Always NULL测试 API Post 传递 <Frombody()> 类 - 始终为 NULL
【发布时间】:2017-08-04 04:58:57
【问题描述】:

我正在 VB 中创建一个 api 控制器类。我有一个非常简单的功能:

Public Function Post(<FromBody()> ByVal value As String) As String
    Return value
End Function

当我从 HTTP 工具(FireFox 扩展)发送 POST 请求时,我可以看到它进入函数,但 value 始终为空。

我的WebApiConfig.vb中有这个:

config.Routes.MapHttpRoute(
        name:="Names",
        routeTemplate:="{controller}/{id}",
        defaults:=New With {.id = RouteParameter.Optional}

这个在Global.ASAX.vbApplication-Start():

RouteTable.Routes.MapHttpRoute(name:="Post", routeTemplate:="post", defaults:=New With {.symbol = RouteParameter.Optional, .controller = "Names"})

我也在 Fiddler 4 中尝试过,但我得到了:

{"Message":"请求包含实体主体但没有Content-Type 标题。推断的媒体类型“application/octet-stream”不是 支持此资源。","ExceptionMessage":"否 MediaTypeFormatter 可用于读取“字符串”类型的对象 来自具有媒体类型的内容 '应用程序/八位字节流'。","ExceptionType":"System.Net.Http.UnsupportedMediaTypeException","StackTrace":" 在 System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent 内容,类型类型,IEnumerable '1 格式化程序,IFormatterLogger formatterLogger, CancellationToken cancelToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage 请求,类型类型,IEnumerable '1 格式化程序,IFormatterLogger formatterLogger, CancellationToken cancelToken)"}

或者当我尝试在标题中设置内容类型时,我得到:

没有 MediaTypeFormatter 可用于读取“字符串”类型的对象 来自具有媒体类型的内容...

<...> 是我设置的任何媒体类型。

如何使这个简单的 POST 工作?

【问题讨论】:

    标签: vb.net asp.net-web-api fiddler


    【解决方案1】:

    看起来您用于 API 的框架不知道如何根据您在请求中设置的内容类型标头解析 POST 请求的正文内容。

    还有,你的API controller may not know how to parse plain text

    您可以手动添加支持的内容类型,也可以根据上述链接中的答案之一手动读取请求内容。或者您可以将您的控制器更改为accept a form post like so

    【讨论】:

    • 这可能是一个相当不错的问题答案。但是,我走了一条不同的路线,并不能真正证明用所提供的答案重新测试它的时间是合理的。希望其他人觉得这很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多