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の後に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 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>
私はweb.configからsystem.webServerセクションを追加しました。あなたがリンクした記事ごとにOKと思われます。 – DaveB
だから何?これは現在動作しているか同じ問題があります –
URLに後ろにスラッシュを付けると、意図したとおりに動作します。このパラメータのドットによって、IISは404に存在しないファイルにマップして試行させていました。最後にスラッシュを入れると、IISはこれが特定のファイルではないことを知ることができます。 – DaveB