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
。如何使我的服务正常工作?
默认的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.
}
}