MVC4 Web API简单参数类型为空

本文关键字:类型 参数 简单 Web API MVC4 | 更新日期: 2023-09-27 18:21:13

我正在使用MVC 4 Web API编写一个服务,以从第三方服务接收POST。这是一个简单的帖子,正文中有一个字符串参数,看起来像key=value

这几乎是Visual Studio创建的默认控制器:

// POST api/register
public void Post([FromBody]string value)
{
}

如果我将该参数作为key=value发布在主体中,那么当它访问服务时,该参数始终为NULL

POST http://localhost:1750/api/Register HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
Host: localhost:1750
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
value=abcdefg

如果我移除密钥,并且只发布=value,那么值就会通过。

POST http://localhost:1750/api/Register HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
Host: localhost:1750
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
=abcdefg

问题是第三方服务正在发布key=value。如何使我的服务正常工作?

MVC4 Web API简单参数类型为空

默认的MediaType是什么?

1个解决方案

制作一个类

 public Class Item {
     public string Value { get; set;}
    }

然后

[HttpPost]
public void Post([FromBody]Item item)
{ 
  // item.Value should have your data.
}

第二个解决方案如果您无法控制数据的来源,您可以要求他们在发送时对文本进行编码吗?

在该罐头中,您可以作为字符串接收值%3xyz然后,您可以接收您的字符串变量,并通过解码进行操作。

第三种解决方案

使用您的自定义序列化程序,如下所示:

  public class CustomJsonMediaFormatter : JsonMediaTypeFormatter
    {
     private JsonSerializerSettings _jsonSerializerSettings;
        public CustomJsonMediaFormatter ()
        {
            _jsonSerializerSettings = CreateDefaultSerializerSettings();
        }
  private object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
var contentHeaders = content == null ? null : content.Headers;
            // If content length is 0 then return default value for this type
            if (contentHeaders != null && contentHeaders.ContentLength == 0)
            {
                return GetDefaultValueForType(type);
            }
            // Get the character encoding for the content
            var effectiveEncoding = SelectCharacterEncoding(contentHeaders);
            try
            {
                using (var reader = (new StreamReader(readStream, effectiveEncoding)))
                {
                    var json = reader.ReadToEnd();
                    var jo = JObject.Parse(json);
                           // jo has got your value=xyz manipulate and feed back.
                }
             }