4

このサイトや他のサイトで何度も質問されていることは承知していますが、これまでに見た解決策は機能していないので、ここにいます.

mvc 4 プロジェクトでいくつかの Web API ルートを設定しています。サンプルは次のとおりです。

routes.MapHttpRoute(name: null, routeTemplate: "Client/Accounts/Save", defaults: new { controller = "AccountsApi", action = "SaveAccount" });

以下のコントローラとアクションに対応:

public class AccountsApiController : ApiController
{
    [HttpPost]
    public object SaveAccount([FromBody] Account input)
    {
      .....

これは、組み込みの VS Web サーバーで実行している場合、および IIS7.5 のローカル (windows 7) インストールで動作し、特別なことは何もしていませんが、Server 2008 R2 の IIS7 で実行している場合は 404 になります。

情報:

  • MVC4 がサーバーにインストールされている
  • アプリケーションは、統合モードとフレームワーク v4 のアプリ プールにあります。

私が試したこと:

  • ルーティングの問題ではないことを知るのに十分なルートで遊んだ
  • 設定済み<modules runAllManagedModulesForAllRequests="true" />(とにかくデフォルトです)
  • これを見た
  • aspnet_regiis -ir ダンスを完了
  • カスタム エラー オフ、コンパイル debug=false - それらが違いを生む場合。
  • カスタム API ルートのみがあり、キャッチオールはありません。
  • ご想像のとおり、IIS ログは 404 を示しているだけです。システム イベント ログに何もない

API はGETPOSTリクエストのみを使用しますが、どちらも機能していません。呼び出しはすべて ajax 経由で行われることにも言及する価値があるかもしれません。

system.web, system.webServer, runtimeconfig のセクション:

<system.web>
    <compilation debug="false" targetFramework="4.0" />
    <customErrors mode="Off" />
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    <pages>
      <namespaces>
        <add namespace="System.Web.Helpers" />
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization" />
        <add namespace="System.Web.Routing" />
        <add namespace="System.Web.WebPages" />
      </namespaces>
    </pages>
  </system.web>

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <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" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
        <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.3.0.0" newVersion="1.3.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

どんな提案でも大歓迎です。ありがとう。

アップデート

コントローラーの1つだけを使用するように再実装しHttpResponseMessageHttpRequestMessage

[HttpGet]
public HttpResponseMessage GetAccount(HttpRequestMessage message)
{
    message.CreateResponse(....

これも、ローカルで実行している場合は期待どおりに機能しますが (Win7 での cassini と完全な IIS ローカル インストールの両方)、サーバーにプッシュすると失敗します。

4

2 に答える 2

0

この問題を修正できませんでした。ほぼ確実に、サーバーにインストールされていないか、スイッチがオンになっていない、あいまいなものが原因です。他の Web API が既に同じボックスで動作しているため、非常にイライラします。

これ以上時間を費やすことができなかったため、代わりにサービス スタックを使用して再実装しました。

于 2013-04-06T20:35:55.057 に答える