1

ASP.NET Web API RC以降、voidAPIコントローラーの操作の宣言に基づくアプローチを使用していました。

AOPとPostSharpを使用して(HttpResponseMessageを使用する代わりに)応答オブジェクトDTOをカスタマイズしていましたが、最後にHttpContext.Response.Write(...)、DTOをJSON文字列にシリアル化してクライアントに送信しました。

ソリューションをASP.NETWebAPI RTMにアップグレードすると、このアプローチは機能しなくなりました。

Web APIから応答を送信し、クライアント側で受信すると、応答自体に200ステータス(OK)を設定しているときに、応答が204ステータス(NoContent)で送信されていることがわかります。

このアプローチはWebAPIのRCバージョンで機能していたため、WebAPI開発チームがRTMバージョンに移行したときのこれは未知の重大な変更であると思われます。

私が間違っている?

4

2 に答える 2

1

私はそのような重大な変更に気づいていませんが、これがRTMで機能しないことを確認できます。とにかく、それはWeb APIを使用するという間違ったアプローチであるため、機能しないのはおそらく良いことです。クライアントへの応答を手動で書き込む場合は、WebAPIの要点全体を無効にします。これを行う既存のコードを変更できない場合は、アップグレードの準備ができるまでGenericASHXハンドラーを使用することをお勧めします。

于 2012-09-25T07:19:53.670 に答える
1

私の知る限り、RTMはPOSTアクションがHttpResponseMessageを返さない場合、デフォルトのステータスコードは204です(RCに戻ったときのように200ではありません)。クライアントが204について不平を言うのを防ぐために私たちができることは2つあります。

a)アクション内から応答メッセージを変更します。

[HttpPost]
public HttpResponseMessage DoWork(MyModel model)
{
   // Do work
   return new HttpResponseMessage(HttpStatusCode.OK) { Content = new ObjectContent<MyModel>(model, FormatterConfig.JsonFormatter) };
}

b)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;
    }
} 
于 2012-09-27T11:11:41.020 に答える