2016-12-20 10 views
0

I以下のMVCコントローラーを持っている:MVC5コントローラ

私はこれらの二つの方法でアクセスできるようにしたい
[RoutePrefix("api/SystemCheck")] 
public class SystemCheckController : ApiController 
{ 
    [HttpGet] 
    [Route("")] 
    [Route("EnvironmentValidate")] 
    [RequiresPrivilegeMVC((int)PrivilegeType.SystemCheck)] 
    public IEnumerable<EnvironmentValidation> Get() 
    { 
     return FilteredEnvironmentValidate(); 
    } 

  1. http://localhost/Perform/API/SystemCheck/EnvironmentValidate
  2. http://localhost/Perform/API/SystemCheck/

オプション2を試してみると、有効な応答が得られます。私はオプション1を試してみてくださいしかし、私が取得:

{ 「メッセージ」:「いいえHTTPリソースが一致する発見されなかったリクエストURI 『http://localhost/Perform/API/SystemCheck/EnvironmentValidate』。」、 「MessageDetail」:「アクションなしが上認められませんでした。 'EnvironmentValidate'という名前と一致するコントローラ 'SystemCheck' }

メソッド名がGetとなっていますが、ルートが「EnvironmentValidate」と指定しているため、コントローラのアクションが見つかりませんか?

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapMvcAttributeRoutes(); 

     routes.MapHttpRoute(
      name: "DefaultApiGet", 
      routeTemplate: "api/{controller}/{action}", 
      defaults: new { action = "Get" }, 
      constraints: new { httpMethod = new HttpMethodConstraint("GET") } 
     ); 

私が欠けているものの任意のアイデアを:ここで

は、私は私のRouteConfig.csを設定している方法ですか?あなたはWEBAPIコントローラとルーティングMVC属性を使用しようとしているように見えます

おかげで、

+0

私はMVCのルートに非常に知識がありません。しかし、私が推測しなければならないのは、あなたの最初のオプションはRoute属性を ""で設定したからではなく、 "Get"がRouteConfigのデフォルトとして設定されているからです。また、MVCコントローラをAPIとして使用したい場合は、代わりにWebAPIを使用することをお勧めします(あなたがそれについて知らなかった場合には気をつけてください) –

+0

MVCでルートをマッピングすると、最初の一致が得られます。この場合は、属性ベースのルーティングでなければなりません。 –

+0

MVCコンポーネントとWebApiコンポーネントが混在している可能性があります。 ApiControllerはWebApi構成であり、WebApi属性ルーティングを使用する必要があります。それぞれの名前空間は、まったく同じクラスを定義していますが、相互に作用しません。 https://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Sunshine

答えて

1

routes.MapMvcAttributeRoutes()は属性を無視しています(期待している名前空間に不一致があるため)DefaultApiGetルートのみがマップされます。

あなたは(あなたが使用しているRoute属性がSystem.Web.Mvc名前空間にあると仮定して)を使用しているルーティングの現在の属性と一致するMVCコントローラを使用するようにするには、ControllerApiControllerを切り替えることができます。

または、WebApi名前空間であるSystem.Web.Httpに名前空間を更新し、代わりにconfig.MapHttpAttributeRoutes()を呼び出すことができます。

さらに詳しい手順はこちらhttps://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 WebApi属性のルーティングを設定します。

関連する問題