15

Web API の自動生成されたヘルプ ページについて明確に説明していただければ幸いです。

私が理解できる限り、 Type を返すと、そのアクションのヘルプページが例とともに自動生成されます。しかし、私が HttpResponseMessage を使用すると、応答がどうなるかを推測できず、要求パラメーターについて推測することしかできないことは理解できます。

私が HttpResponseMessage を使用していた理由は、200 以外の可能性がある場合に返したいステータス コードを示すことが推奨されていたためです。

では、目的のステータス コードを返せるようにするためのベスト プラクティス アプローチは何ですか?

4

3 に答える 3

19

HttpResponseMessage を返す必要があるこれらのシナリオの回避策は、HelpPage が提供するいくつかのヘルパーを使用して、その特定のアクションの実際の戻り値の型を示すことです。パスで次のコードを見つけることができますAreas\HelpPage\App_Start\HelpPageConfig.cs

//// Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent<string>.
//// The sample will be generated as if the controller named "Values" and action named "Post" were returning a string.
//config.SetActualResponseType(typeof(string), "Values", "Post");

:
次のリリースでは、応答の実際のタイプを示すを指定System.Web.Http.Description.ResponseTypeAttributeできる、という新しい属性を導入しています。System.Typeこのようにして、アクションから戻っHttpResponseMessageたりIHttpActionResult、アクションから戻ったりしても、HelpPage が機能することを期待できます。

于 2013-07-23T22:37:42.577 に答える
8

アトリビュートは素晴らしいアイデアだと思うので、皆さんがリリースするまで他の人を助けるアトリビュートを実装しました。

アクションを次の属性で装飾します。

public class FooController : ApiController
{
    [ResponseType(typeof(Bar))]
    public HttpResponseMessage Get(string id)
    {
        // ...
    }
}

属性を定義します。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ResponseTypeAttribute : Attribute
{
   public ResponseTypeAttribute(Type type)
   {
       if (type == null)
       {
           throw new ArgumentNullException("type");
       }

       Type = type;
   }

   public Type Type { get; private set; }
}

応答タイプを登録するメソッドを定義します。

/// <summary>
///     Registers api controller actions which return HttpResponseMessage
///     and include the ResponseType attribute to be populated with web api
///     auto generated help.
/// </summary>
/// <param name="assembly">The assembly to search for</param>
public static void RegisterHelpResponseTypes(Assembly assembly)
{
    var apiControllerTypes = assembly
        .GetTypes().Where(typeof(ApiController).IsAssignableFrom);

    foreach (var apiControllerType in apiControllerTypes)
    {
        var validActions = apiControllerType.GetMethods()
            .Where(method =>
                Attribute.IsDefined(method, typeof(ResponseTypeAttribute))
                &&
                (method.ReturnType == typeof(HttpResponseMessage)));

        foreach (var action in validActions)
        {
            var responseType = (ResponseTypeAttribute)Attribute
                                    .GetCustomAttributes(action)
                                    .Single(x => x is ResponseTypeAttribute);

            var controllerName = apiControllerType.Name.Substring(0, 
                    apiControllerType.Name.LastIndexOf("Controller", 
                                        StringComparison.OrdinalIgnoreCase));
            var actionName = action.Name;

            GlobalConfiguration
                .Configuration
                .SetActualResponseType(responseType.Type, 
                                       controllerName, 
                                       actionName);
        }
    }
}

アプリケーションの開始時にそれを含めます。

RegisterHelpResponseTypes(typeof(FooController).Assembly);

問題が見つかった場合はお知らせください。

于 2013-07-23T23:36:51.943 に答える
8

MVC 5 には、応答タイプを設定する組み込みの属性があります。

詳細はこちら: http://thesoftwaredudeblog.wordpress.com/2014/01/05/webapi-2-helppage-using-responsetype-attribute-instead-of-setactualresponsetype/

使用するだけです:

    ResponseType(typeof([Your_Class]))]
于 2014-05-22T09:42:43.393 に答える