ian*_*one 195 .net c# asp.net-web-api asp.net-web-api-routing
自从升级到RC for WebAPI后,我在WebAPI上调用POST时遇到了一些奇怪的问题.我甚至回到了新项目生成的基本版本.所以:
public void Post(string value)
{
}
Run Code Online (Sandbox Code Playgroud)
并从Fiddler打来电话:
Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29
Body:
{
"value": "test"
}
Run Code Online (Sandbox Code Playgroud)
当我调试时,字符串"value"永远不会被分配给.它总是为NULL.谁有这个问题?
(我第一次看到更复杂类型的问题)
问题不仅仅是绑定到ASP.NET MVC 4,在安装RC后,新的ASP.NET MVC 3项目也会出现同样的问题
Jim*_*rte 101
由于您只有一个参数,您可以尝试使用该[FromBody]属性进行装饰,或者更改方法以接受具有值作为属性的DTO,如我在此建议:MVC4 RC WebApi参数绑定
更新:官方ASP.NET站点今天更新了一个很好的解释:http://www.asp.net/web-api/overview/working-with-http/sending-html-form-data,-part-1
简而言之,当在正文中发送单个简单类型时,只发送前缀为等号(=)的值,例如body:
=test
Oce*_*rop 101
今天我一直在摸不着头脑.
我的解决方案是将a更改[FromBody]为a HttpRequestMessage,从根本上提升HTTP堆栈.
在我的情况下,我通过电线发送数据,这是拉链json,然后base64'd.这一切都来自Android应用程序.
我的Web端点的原始签名看起来像这样(使用[FromBody]):

我对此问题的解决方法是恢复使用a HttpRequestMessage作为我的端点的签名.

然后,您可以使用以下代码行访问帖子数据:

这有效,并允许您访问原始未触及的后期数据.你不必乱搞fiddler在你的字符串的开头添加一个=符号或更改内容类型.
顺便说一句,我首先尝试按照上面的一个答案将内容类型更改为:"Content-Type:application/x-www-form-urlencoded".对于原始数据,这是一个糟糕的建议,因为它剥离了+字符.
所以像这样开始的base64字符串:"MQ0AAB + LCAAAAAA"就像这样的"MQ0AAB LCAAAAAA"!不是你想要的.
使用的另一个好处HttpRequestMessage是您可以访问端点中的所有http标头.
Kir*_*rst 71
我刚刚使用Fiddler发生了这种情况.问题是我没有指明Content-Type.
尝试Content-Type在POST请求中包含标题.
Content-Type: application/x-www-form-urlencoded
Run Code Online (Sandbox Code Playgroud)
或者,根据下面的评论,您可能需要包含JSON标头
Content-Type: application/json
Run Code Online (Sandbox Code Playgroud)
Geo*_*rge 56
我也遇到过这个问题,这就是我解决问题的方法
webapi代码:
public void Post([FromBody] dynamic data)
{
string value = data.value;
/* do stuff */
}
Run Code Online (Sandbox Code Playgroud)
客户代码:
$.post( "webapi/address", { value: "some value" } );
Run Code Online (Sandbox Code Playgroud)
Jer*_*yal 37
我正在使用Postman,我也犯了同样的错误..传递valuejson对象而不是字符串
{
"value": "test"
}
Run Code Online (Sandbox Code Playgroud)
显然,当api参数是string类型时,上面的错误.
所以,只需在api体中用双引号传递字符串:
"test"
Run Code Online (Sandbox Code Playgroud)
Des*_*tar 18
尝试创建一个类作为数据模型,然后发送一个JSON对象,其属性与数据模型类的属性相匹配.(注意:我已对此进行了测试,它与我刚刚下载的最新MVC 4 RC 2012一起使用).
public HttpResponseMessage Post(ValueModel model)
{
return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}
public class ValueModel
{
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
下面的JSON对象在HTTP-POST主体中发送,content-type是application/json
{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }
Run Code Online (Sandbox Code Playgroud)
我相信您必须创建数据模型类的原因是因为假设简单值来自url参数,并且假设单个复杂值来自正文.他们确实拥有[FromBody]和[FromUrl]属性,但使用[FromBody] string value仍然不适合我.看起来他们仍然在制造很多错误,所以我相信这将在未来发生变化.
编辑: 让XML在正文中工作.默认的XML序列化程序已更改为DataContractSerializer而不是XmlSerializer.将以下行放在我的Global.asax文件中修复了此问题(参考)
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
Run Code Online (Sandbox Code Playgroud)
Leo*_*eon 13
经过一些尝试,我认为默认行为是正确的,没有什么可以破解.
唯一的技巧是:如果你的post方法参数string如下所示,你应该在正文中发送一个带双引号的普通字符串(当使用ajax或postman时),例如,
//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
return "received " + value; // "received {\"a\":1}"
}
Run Code Online (Sandbox Code Playgroud)
否则,如果你在帖子体中发送一个没有外部双引号和转义内部引号的json字符串,那么它应该能够被解析为模型类(参数类型),例如,{"a":1, "b":2}
public class MyPoco{
public int a;
public int b;
}
//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
return "received " + value.ToString(); //"received your_namespace+MyPoco"
}
Run Code Online (Sandbox Code Playgroud)
这对我有用:
创建一个C#DTO类,其中包含要从jQuery/Ajax传递的每个属性的属性
public class EntityData
{
public string Attr1 { get; set; }
public string Attr2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)定义web api方法:
[HttpPost()]
public JObject AddNewEntity([FromBody] EntityData entityData)
{
Run Code Online (Sandbox Code Playgroud)像这样调用web api:
var entityData = {
"attr1": "value1",
"attr2": "value2"
};
$.ajax({
type: "POST",
url: "/api/YOURCONTROLLER/addnewentity",
async: true,
cache: false,
data: JSON.stringify(entityData),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
...
}
});
Run Code Online (Sandbox Code Playgroud)对于那些像我一样遇到Swagger或Postman的问题的人,如果您将简单的属性作为字符串传递给帖子,即使指定了“ ContentType”,您仍将获得null值。
仅通过:
我的价值
将作为空值进入控制器。
但是,如果您通过:
“我的价值”
该值将正确。
引号在这里有所不同。当然,这仅适用于Swagger和Postman。例如,在使用Angular的前端应用程序中,此问题应由框架自动解决。
| 归档时间: |
|
| 查看次数: |
309358 次 |
| 最近记录: |