4

ルートディレクトリにWCFというフォルダを追加したMVCプロジェクトがあります。このフォルダー内に、というタイトルのWCFサービスを作成しましたCustomFunctions。サービスを開始しようとすると、次のエラーが発生します。

エラー:メタデータを取得できませんhttp://localhost/Viper/WCF/CustomFunctions.svc...メタデータに解決できない参照が含まれています:

追加の説明付き:

ServiceHostディレクティブでService属性値として提供されている、または構成要素system.serviceModel / serviceHostingEnvironment/serviceActivationsで提供されているタイプ'Viper.WCF.CustomFunctions'が見つかりませんでした。

私は昨日このエラーが発生し、インターネットで答えを探すのに時間を費やしました。これにより、Web.configとGlobal.asax.csに多くの変更を加えることになりました。昨日のある時点で動作を開始し、停止しました。しかし、私が今朝戻ってきたとき、それは再び機能していませんでした。その間、新しいものは何も追加されず、コードも変更されませんでした。

Web.configに以下を追加しました。

<system.serviceModel>
<services>
  <service behaviorConfiguration="WCFBehavior" name="Viper.WCF.CustomFunctions">
    <endpoint address="" binding="wsHttpBinding" contract="Viper.WCF.ICustomFunctions">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost/Viper/WCF/CustomFunctions/" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="WCFBehavior">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" httpGetUrl=""/>
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel> 

そしてこれは私のGlobal.asax.cs

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.svc/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new
            {
                controller = "Home",
                action = "Index",
                id = UrlParameter.Optional
            }, // Parameter defaults
            new { controller = "^(?!CustomFunctions).*" }
        );

        routes.Add(new ServiceRoute("CustomFunctions", new ServiceHostFactory(),
                   typeof(CustomFunctions)));
    }

誰か助けてもらえますか?私はここですべてのアイデアがありません。

4

1 に答える 1

5

私は問題を理解しました。まず、ルートを登録する関数へのパスの一部が欠落していました。そのパスを修正した後、ホスティング環境にwsdlが表示されるようになりました。ただし、これにより、私のエリアのデフォルトのルーティングが台無しになりました。したがって、将来この問題が発生する人のために、ここに私の解決策があります:

public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.svc/{*pathInfo}");

        routes.MapRoute(
            "CustomFunctions", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new
            {
                controller = "CustomFunctions",
                action = "Index",
                id = UrlParameter.Optional
            }, // Parameter defaults
            new { controller = "^(?!CustomFunctions).*" }
        );

        routes.Add(new ServiceRoute("CustomFunctions", new ServiceHostFactory(),
                   typeof(CustomFunctions)));

        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");           

        // Had to do some special stuff here to get this to work using a default area and no controllers/view in the root
        routes.MapRoute(
            name: "Default",
            url: "{area}/{controller}/{action}/{id}",
            defaults: new { area = "", controller = "Home", action = "Index", id = UrlParameter.Optional },
            namespaces: new string[] { "Viper.Areas.Home" }
        ).DataTokens.Add("area", "Home");           
    }

カスタムルートを主に指定したので、指定したURLに移動すると、.svcファイルが表示されます。Global.asax.csのApplicationStartメソッドからこのメソッドを呼び出します。また、ホームエリア内にCustomFunctionsの個別のコントローラーとビューを作成して、デフォルトルートとCustomFunctionsを区別できるようにし、上記のようにルートマップでそれを指定する必要がありました。したがって、localhost \ Viperに移動すると、デフォルトマップで指定されたルートが検索され、localhost \ Viper \ CustomFunctionsに移動すると、.svcファイルへのルートが検索されます。IgnoreRouteは基本的にそれを可能にするので、ページを呼び出すときにURLの最後にファイル拡張子を付ける必要はありません。したがって、CustomFunctions.svcではなく、CustomFunctionsのみを指定します。必ずSystem.ServiceModelを追加してください。

皆さんの助けに感謝します。これが他の貧しい失われた魂を助けることを願っています。

于 2012-12-18T22:00:51.647 に答える