如何在MVC webApi控制器操作中读取PUT请求中的内容.
[HttpPut]
public HttpResponseMessage Put(int accountId, Contact contact)
{
var httpContent = Request.Content;
var asyncContent = httpContent.ReadAsStringAsync().Result;
...
Run Code Online (Sandbox Code Playgroud)
我在这里得到空字符串:(
我需要做的是:弄清楚在初始请求中修改/发送了什么属性(意味着如果Contact对象有10个属性,并且我只想更新其中2个属性,我只发送和对象只有两个属性,这样的事情:
{
"FirstName": null,
"LastName": null,
"id": 21
}
Run Code Online (Sandbox Code Playgroud)
预期的最终结果是
List<string> modified_properties = {"FirstName", "LastName"}
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现此代码示例,但得到HttpRequestException- " 将内容复制到流时出错 ".ReadAsStringAsync()调用方法时 内部异常是" 无法访问已处置的对象".我正在使用Fiddler来提出请求.我不明白.有人可以解释为什么我得到这个例外并提供解决方案吗?
Web Api方法:
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
try
{
var jsonString = await request.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
throw;
}
return new HttpResponseMessage(HttpStatusCode.Created);
}
Run Code Online (Sandbox Code Playgroud)
提琴手(POST):
User-Agent: Fiddler
Host: localhost:23567
Content-Length: 18
Content-Type: application/json; charset=utf-8
Body{"Test":1}
Run Code Online (Sandbox Code Playgroud)
编辑:
我有一个线索,但需要验证.在Web Api控制器上,我有一个ActionFilterAttribute并且在它的OnActionExecuting覆盖中,有这一行:
public override async void OnActionExecuting(HttpActionContext actionContext)
{
// omitted code
actionContext.Request.Content.ReadAsStreamAsync();
}
Run Code Online (Sandbox Code Playgroud)
可能是因为内容在这里被读取,它再也无法使用?如果是这样,我怎么能在方法中使它?此处的内容是否与HttpRequestMessage相同? 这可能包含答案.
我正在尝试注销Web API请求内容 - 即json字符串.我实现了一个ITraceWriter类(示例)并对其进行了配置,以便Web API在管道中调用它.但是,如果我读取请求.内容或复制到流中读取它不适用于导致空模型的方法. 这篇文章稍微谈到了这个问题.任何人都有登出入站Web API请求内容的经验,并知道最佳方法是什么?
谢谢
更新A.
我创建了一个简单的示例Web API项目来排除项目中的任何内容,我仍然看到由于日志记录,模型将为null.我只是通过Fidder发布测试连续几次,看看我的模型是否为null.有了断点,它可能会起作用,这就是为什么我认为存在同步/计时问题.有关如何使其工作的任何想法?
标题:
User-Agent: Fiddler
Host: localhost:56824
Content-Type: application/json
Content-Length: 22
Run Code Online (Sandbox Code Playgroud)
身体:
{
"A":1,"B":"test"
}
Run Code Online (Sandbox Code Playgroud)
这是代码:
控制器:
public class ValuesController : ApiController
{
[HttpPost]
public void Post(ValuesModel model)
{
if (model == null)
{
Debug.WriteLine("model was null!");
}
else
{
Debug.WriteLine("model was NOT null!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
模型:
public class ValuesModel
{
public int A { get; set; }
public string B { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
记录仪: …