web-dev-qa-db-ja.com

IIS(svcファイルなし)で.net 4 WCFサービスを実行している場合は404

.net 4のWCFでRESTサービスをテストしています-つまり、SVCファイルがありません。 VS開発サーバーに対して実行するとうまく機能しますが、IISに対して実行するように切り替えると、ヘルプページを参照したり、サービスメソッドのいずれかをヒットしたりすると、404が発生します。

IISで実行するために必要最低限​​のサービスに戻りましたが、何が問題なのかわかりません。

Global.asaxは単に

    protected void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.Add(new ServiceRoute("", new WebServiceHostFactory(), typeof(DataPortalService)));
    }

そしてサービス自体はそれが得るのと同じくらい簡単です:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataPortalService : IDataPortalService
{
    [WebGet(UriTemplate = "Test/TestMethod")]
    public string TestMethod()
    {
        return "Hi!";
    }
}

[ServiceContract]
public interface IDataPortalService
{
    [OperationContract]
    string TestMethod();
}

および構成ファイル

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
        <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>  

</configuration>

/ helpページまたはメソッドを押すと、404.0になります。

IISの設定が不足していると思いますが、IISではなく、開発サーバーでは正常に機能するのは少し意外です。

22
Chris W

他のいくつかのフォーラムの周りの発掘後にそれを解決しました。

私は最初に以下を私のWeb設定に追加しました:

<system.webServer>
    <handlers>
        <remove name="svc-Integrated-4.0" />
        <add name="svc-Integrated-4.0" path="*" verb="*" type="System.ServiceModel.Activation.ServiceHttpHandlerFactory, System.ServiceModel.Activation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" resourceType="Unspecified" requireAccess="Script" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

明らかにデフォルトでIISは、拡張子のないリクエストをどう処理するかわからず、静的ファイルハンドラーに渡しました。

MVCが同じルーチンアーキテクチャを使用していることを考えると、MVCサイトはIISに移動したときに正常に機能しているため、基本的なMVCサイトテンプレートには上記と同様の構成が必要であると考えました。

構成が少し異なり、代わりに次のエントリがあることがわかります。

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

どちらの設定も問題なく動作するようですが、この場合は2番目のオプションを使用することにしました。

29
Chris W

runAllManagedModulesForAllRequests="true" web.configで、404.0を超えることができませんでした。 「IIS 7推奨構成」のインストールも運が悪かった。再実行aspnet_regiis問題を解決しました。

  1. [ファイル名を指定して実行]ダイアログボックスで「cmd」と入力し、[OK]をクリックします。

  2. コマンドプロンプトで、cdコマンドを使用して、使用するAspnet_regiis.exeバージョンのディレクトリを変更します。デフォルトでは、Aspnet_regiis.exeは次のディレクトリにあります。systemroot\ Microsoft.NET\Framework\versionNumber

  3. 次に、次のコマンドを実行します。aspnet_regiis -ir

これにより、ハンドラーマッピングに「svc-Integrated-4.0」が登録されます。

10
muruge

.NET Frameworkのコンポーネントがインストールされていない場合も、HTTP 404コードが返されることがあります。

たとえば、_Windows Communication Foundation HTTP Activation_には_.NET Framework 3.5_機能があり、_.NET Framework 4.6_には_HTTP Activation_、Message Queuing (MSMQ) Activationなどがあります。

Windows 10では、これらの機能はデフォルトではインストールされないため、_Windows Features_を参照してください。

1
Landeeyo

IIS 5.1 on my machine)で、.svcページは、Webサイトレベルおよび仮想フォルダーレベルでHTTPハンドラーを追加したときにのみ提供されました。これは、継承によって機能するはずです。

拡張子:。svc

実行可能:

c:\ WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

0
user3876403