1

広く配布されている ASP.NET WebForms アプリがあります。私の新しいバージョンには Web.API が追加されており、ユーザーはベータ版で遊んでいます。ほとんどのベータ インストールではすべて正常に動作しますが、一部のインストールでは、すべての Web.API 呼び出しが HTTP 404 Not Found エラーを返します。一部のサーバーでは Web.API 呼び出しが失敗し、他のサーバーでは正常に機能する理由がわかりません。

私の推測では、ルーティングを壊しているある種のサーバー構成があると思いますが、それが何であるかはわかりません。これらのサイトの 1 つに RDP で接続したことさえありますが、明確なものは何も見つかりません。

これは API 呼び出しの例です。

GET http://site.com/api/events/27

コード:

namespace GalleryServerPro.Web.Api
{
  public class EventsController : ApiController
  {
    public string Get(int id)
    {
      return "Event data for ID " + id;
    }
  }
}

GspHttpApplication という名前のカスタム HTTP モジュールの Init イベントから呼び出されるルート定義:

private void RegisterRoutes(RouteCollection routes)
{
  routes.MapHttpRoute(
    name: "GalleryApi1",
    routeTemplate: "api/{controller}"
  );

  routes.MapHttpRoute(
    name: "GalleryApi2",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { },
    constraints: new
    {
      id = @"\d*",
    }
  );

  routes.MapHttpRoute(
    name: "GalleryApi3",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new
    {
    },
    constraints: new
    {
      id = @"\d*"
    }
  );

  // Add route to support things like api/meta/galleryitems/
  routes.MapHttpRoute(
    name: "GalleryApi4",
    routeTemplate: "api/{controller}/{action}",
    defaults: new
    {
    },
    constraints: new
    {
    }
  );
}

上記の GET の例は、GalleryApi2 という名前のルートと一致する必要があり、ほとんどのインストールで述べたように一致します。

WebDAV が問題 (405 エラー) を引き起こす可能性があることはわかっているので、web.config で既に削除しています。

<system.webServer>
  <modules>
    <remove name="WebDAVModule" />
    <add name="GspApp" type="GalleryServerPro.Web.HttpModule.GspHttpApplication, GalleryServerPro.Web" />
  </modules>
  <handlers>
    <remove name="WebDAV" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
  ...
</system.webServer>

したがって、すべては、この構成が一部の Web インストールで機能し、他の Web インストールでは機能しない理由を理解することに帰着します。

ロジャー

4

0 に答える 0