2016-10-18 7 views
0

ASP.NET MVCアプリケーションにWeb API機能を追加し、属性ルーティングを使用したいとします。 Visual Studio 2015でサイトを実行しているときに、ブラウザのアドレスバーにURLを入力して、コントローラのメソッドを動作させることができます。サイトをIISに移動すると、404の応答が得られます。私は運がない多くのコード変更を試みました。Web API属性のルーティングを行う方法

BuilderApiControllerファイルはWebAPI/v1/Controllersフォルダにあります。コントローラーの属性はここにありますか?

namespace Hds.Edsi.WebAPI.V1.Controllers 
{ 
    [System.Web.Http.RoutePrefix("api/v1/builder")] 
    public class BuilderApiController : BaseApiController 
    { 
     [System.Web.Http.Route("GetExternalOrganizationID/{envisionOrgID}")] 
     [System.Web.Http.HttpGet] 
     public HttpResponseMessage GetExternalOrganizationID(string envisionOrgID) 
     { 

WebApiConfig.csファイル。標準的なもの。属性ルーティングを使用している場合、config.Routes.MapHttpRouteの部分が必要ですか?私はそれを試してみた。

私がそれを必要とすれば、config.MapHttpAttributeRoutes()の目的は何ですか? Registerの後にGlobalConfigurationConfiguration._routesを見ると、属性ルーティング定義ルートはありません。彼らはすべきでしょうか?

namespace Hds.Edsi.WebAPI 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      /* 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/v1/{controller}/{action}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 
      */ 

protected void Application_Start() 
{ 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    AreaRegistration.RegisterAllAreas(); 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 
    GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 

    Components.Automapper.CreateMaps(); 

    // Requrired for managing AppDomain teardown - IRegisteredObject 
    MonitorManager.RegisterInstance(); 
} 

IIS Expressの場合:私が期待するよう

http://localhost:8181/api/v1/builder/GetExternalOrganizationID/123.123.123.123.1234はJSONオブジェクトを返します。

IIS:

私はここに簡単な何かをしないのですか属性が作品をルーティングする方法を理解していないことを推測しています404

を返しhttp://my server/api/v1/builder/GetExternalOrganizationID/123.123.123.123.1234。それはあなたのIIS上で正常に動作していない場合、私は、知っているように、そしてそれは、IISで1として

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" /> 
     <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" /> 
    </modules> 
    <handlers> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" /> 

    <remove name="OPTIONSVerbHandler" /> 
    <remove name="TRACEVerbHandler" /> 
    </handlers> 
    </system.webServer> 

答えて

1

:ここ

追加

は、web.configファイルからsystem.webServer部であり、 ASP.NETエラーではなく、実際にはASP.NETのルーティングエンジンからではなく、IISが無意味なURLを処理しているからです。

あなたはリックシュトラールのWebログASP.NET Routing not working on IIS 7.0

このことができます希望を参照することができ、詳細には、あなたのweb.config

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <add name="ScriptCompressionModule" type="Westwind.Web.ScriptCompressionModule,Westwind.Web" /> 
     </modules> 
</system.webServer> 

runAllManagedModulesForAllRequestsを追加することで試すことができます!

+0

私はweb.configからsystem.webServerセクションを追加しました。あなたがリンクした記事ごとにOKと思われます。 – DaveB

+0

だから何?これは現在動作しているか同じ問題があります –

+0

URLに後ろにスラッシュを付けると、意図したとおりに動作します。このパラメータのドットによって、IISは404に存在しないファイルにマップして試行させていました。最後にスラッシュを入れると、IISはこれが特定のファイルではないことを知ることができます。 – DaveB

関連する問題