4

Content-Typeサービスでサポートされていない型を含むヘッダーを持つ Web API サービスに対して要求が行われる500 Internal Server Errorと、次のようなメッセージを含むステータス コードが返されます。

{"Message":"An error has occurred.","ExceptionMessage":"No MediaTypeFormatter is available to read an object of type 'MyDto' from content with media type 'application/UnsupportedContentType'.","ExceptionType":"System.InvalidOperationException","StackTrace":" at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
   at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
   at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger)
   at System.Web.Http.ModelBinding.FormatterParameterBinding.ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
   at System.Web.Http.Controllers.HttpActionBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(HttpParameterBinding parameterBinder)
   at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
   at System.Threading.Tasks.TaskHelpers.IterateImpl(IEnumerator`1 enumerator, CancellationToken cancellationToken)"}

415 Unsupported Media Type代わりに、推奨されるようにステータス コードを返したいと思います (例: here ) 。

これを行うようにサービスを構成するにはどうすればよいですか?

4

3 に答える 3

5

これが私がこの問題に対して思いついた解決策です。

これは、受け入れ可能な応答コンテンツ タイプがない場合に 406 Not Acceptable ステータス コードを送信するためにここで説明されているものに広く基づいています。

public class UnsupportedMediaTypeConnegHandler : DelegatingHandler {
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                           CancellationToken cancellationToken) {
        var contentType = request.Content.Headers.ContentType;
        var formatters = request.GetConfiguration().Formatters;
        var hasFormetterForContentType = formatters //
            .Any(formatter => formatter.SupportedMediaTypes.Contains(contentType));

        if (!hasFormetterForContentType) {
            return Task<HttpResponseMessage>.Factory //
                .StartNew(() => new HttpResponseMessage(HttpStatusCode.UnsupportedMediaType));
        }

        return base.SendAsync(request, cancellationToken);
    }
}

そして、サービス構成をセットアップするとき:

config.MessageHandlers.Add(new UnsupportedMediaTypeConnegHandler());

これには、文字セットも一致する必要があることに注意してください。MediaTypeヘッダーのプロパティのみをチェックすることで、この制限を緩めることができます。

于 2012-08-23T20:29:03.287 に答える
0

ステータス コードを自動的に変更する設定フラグはありません。おそらく「送信されている応答」をチェックし、ステータスコードを415に変更できる MessageHandler を作成できます。

于 2012-08-23T20:20:27.997 に答える
-1

ステータス コードを返す標準的な方法は、アクションから HttpResponseMessage を返すことです。Raw コンテンツの代わりに、コンテンツを HttpResponseMessage オブジェクトでラップし、次のようにステータスを設定できます。

public System.Net.Http.HttpResponseMessage Getresponse()
    {
        return new System.Net.Http.HttpResponseMessage() { Content = new System.Net.Http.StringContent(done.ToString()), StatusCode = System.Net.HttpStatusCode.Conflict };
    }
于 2012-08-24T07:07:48.147 に答える