2016-10-18 7 views
0

ASP.NET MVC 응용 프로그램에 웹 API 기능을 추가했으며 특성 라우팅을 사용하려고합니다. Visual Studio 2015에서 사이트를 실행할 때 브라우저 주소 표시 줄에 URL을 입력하고 컨트롤러에서 메서드를 가져와 작업 할 수 있습니다. 일단 사이트를 IIS로 옮기면 404 답변을 얻을 수 있습니다. 행운을 빌어 많은 코드 변경을 시도했습니다.웹 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()의 목적은 무엇입니까? 레지스터가 호출 된 후 GlobalConfiguration, Configuration._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 익스프레스 :

http://localhost:8181/api/v1/builder/GetExternalOrganizationID/123.123.123.123.1234 내가 기대로 JSON 개체를 반환합니다.

는 IIS :

http://my server/api/v1/builder/GetExternalOrganizationID/123.123.123.123.1234 내가 여기에 간단하게 뭔가를 놓치고 또는 라우팅 작업 특성을 이해하지 않는 것이 추측하고 404

를 반환합니다. 내가 아는 한 당으로 그것이 당신의 IIS에서 제대로 작동하지 않는 경우

<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

가, 그 다음은 IIS입니다 : 여기에 추가

은 Web.config의에서의 system.webServer 섹션입니다 오류가 아니라 ASP.NET 오류가 아니므로 실제로 ASP.NET의 라우팅 엔진에서 오는 것이 아니라 IIS에서 무표정 URL을 처리 한 것입니다.

당신은 릭 Strahl의 웹 로그 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에서 특정 파일이 아니라는 것을 IIS에 알리면 라우팅이 작동합니다. – DaveB