Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Web API:RC更改为RTM。使用HttpContext发送内容以NoContent状态结束_C#_Asp.net_Asp.net Web Api_.net 4.5_C# 5.0 - Fatal编程技术网

C# ASP.NET Web API:RC更改为RTM。使用HttpContext发送内容以NoContent状态结束

C# ASP.NET Web API:RC更改为RTM。使用HttpContext发送内容以NoContent状态结束,c#,asp.net,asp.net-web-api,.net-4.5,c#-5.0,C#,Asp.net,Asp.net Web Api,.net 4.5,C# 5.0,由于ASP.NET Web API RC,我使用了一些基于声明void API控制器操作的方法 我使用AOP和PostSharp定制了一个响应对象DTO(而不是使用HttpResponseMessage),最后使用HttpContext.response.Write(…)将DTO序列化为JSON字符串发送给客户端 当我将解决方案升级到ASP.NET Web API RTM时,这种方法不再有效 每当我从Web API发送响应并在客户端接收到它时,我发现在我为响应本身设置200状态(OK)时,响应以

由于ASP.NET Web API RC,我使用了一些基于声明void API控制器操作的方法

我使用AOP和PostSharp定制了一个响应对象DTO(而不是使用HttpResponseMessage),最后使用
HttpContext.response.Write(…)
将DTO序列化为JSON字符串发送给客户端

当我将解决方案升级到ASP.NET Web API RTM时,这种方法不再有效

每当我从Web API发送响应并在客户端接收到它时,我发现在我为响应本身设置200状态(OK)时,响应以204状态(NoContent)发送

因为这种方法在WebAPI的RC版本中有效,所以我怀疑当WebAPI开发团队转换到RTM版本时,这是一个未知的突破性变化


我错了吗

我没有意识到这种破坏性的变化,但我可以确认这在RTM中不起作用。无论如何,这是一种错误的使用Web API的方法,它不起作用可能是一件好事。如果要手动将响应写入客户机,则会扼杀整个Web API。如果您有一些无法修改的现有代码,那么我建议您使用通用ASHX处理程序,直到您准备好升级。

据我所知,因为RTM如果POST操作未返回HttpResponseMessage,则默认状态代码为204(而不是RC中的200)。我知道,我们可以做两件事来避免客户抱怨

a) 从您的操作中更改响应消息:

[HttpPost]
public HttpResponseMessage DoWork(MyModel model)
{
   // Do work
   return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<MyModel>(model, FormatterConfig.JsonFormatter) };
}
[HttpPost]
公共HttpResponseMessage DoWork(MyModel)
{
//工作
返回新的HttpResponseMessage(HttpStatusCode.OK){Content=newObjectContent(model,FormatterConfig.JsonFormatter)};
}
b) 在DelegatingHandler中更改响应(通过一般方式脏)

公共类响应句柄:DelegatingHandler
{
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
var response=base.sendaync(请求、取消令牌);
response.Result.StatusCode=response.Result.issucessstatuscode?System.Net.HttpStatusCode.OK:response.Result.StatusCode;
返回响应;
}
} 

这是一种定制方式。我怀疑这是一个突破性的改变,因为如果我重构一个操作以返回我的自定义对象,它就会工作。更奇怪的是,这种方法不适用于内容,但是HTTP头仍然是通过使用HttpContext发送的!你能展示一些代码并解释一下预期的结果是什么吗?也许有更好的方法来实现你想要实现的任何东西。这是一个从头开始制作的API,我才刚刚开始。我不认为这扼杀了WebAPI的意义。重点是一个易于配置的Web服务基础设施,它不像以前使用WCF的基础设施那样痛苦。此外,它对休息也很友好。如果我认为“现状”适合我,我倾向于使用“现状”工具。但是,如果我需要充分利用这个工具并添加一些内容,我可以将官方方法与我自己的方法混合使用。好的,那么你愿意分享一些代码,以便我们可以就一些特定的内容进行建设性的讨论吗?另一方面,我知道如何将其更改为官方方法。我的问题是,这是否是一个已知的突破性变化:DNice!你的答案很有用!遗憾的是(或者希望如此),为了更好地使用WebAPI RTM,我已经更改了代码库。最棒的是我有“void操作”,我让WebAPI创建标准的ResponseMessage,同时在过滤器中设置消息内容、标题和/或代码。但我期待一个DelegatingHandler,它可以在其他情况下帮助您,而无需创建过滤器!
public class ResponseHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var response = base.SendAsync(request, cancellationToken);

        response.Result.StatusCode = response.Result.IsSuccessStatusCode ? System.Net.HttpStatusCode.OK : response.Result.StatusCode;
        return response;
    }
}