ServiceRoute + WebServiceHostFactory は WSDL 生成を中止しますか?wsdl を使用して拡張子のない WCF サービスを作成する方法 質問する

ServiceRoute + WebServiceHostFactory は WSDL 生成を中止しますか?wsdl を使用して拡張子のない WCF サービスを作成する方法 質問する

拡張子なし / .svc なしの WCF サービスを使用しようとしています。私が経験している問題を確認または否定できる人はいますか?

コード内でルーティングを使用し、global.asax.cs の Application_Start でこれを実行します。

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips)));

私はIIS 6とIIS 7.5の両方でテストしましたが、サービスは問題なく使用できました(つまり、拡張子のないワイルドカードマッピングハンドラー構成はASP.NETに正しく指定されています)。ただし、メタデータ生成は完全に失敗しています。できるWCF テスト クライアント (およびおそらく svcutil.exe) を使用して /mex エンドポイントにアクセスしましたが、.svc で通常取得される ?wsdl 生成は失敗しました。ブラウザーではアクセスできず (400 不正な要求が発生)、wsdl.exe などでもアクセスできません。メタデータ生成は web.config で正しく構成されています。

もちろん、これは問題です。なぜなら、サービスは basicHttpBinding として公開されており、古いスタイルの ASMX クライアントがアクセスできるからです。しかし、もちろん、クライアントは WSDL 記述なしではプロキシを生成できません。

コードでルートを登録するのではなく、次のように構成で serviceActivation ルーティングを使用する場合:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
  <serviceActivations>
    <add relativeAddress="Data.svc" service="DataDips" />
  </serviceActivations>
</serviceHostingEnvironment>

すると、なんと...うまくいきました。

しかし、拡張子のないクリーンな URL がありません。relativeAddress を Data.svc から Data に変更すると、構成でサポートされていないため、構成例外が発生します (WCF に登録された拡張機能を使用する必要があります)。

また、上記の設定と組み合わせてこのコードを使用することも試みました:

RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false);

私の考えでは、拡張子のない URL を、構成された .svc URL に指定するだけでよいのですが、これは機能しません。/Data.svc は引き続き機能しますが、/Data は 404 を返します。

上記の serviceActivation と組み合わせて、次のように構成で urlMappings を使用すると回避策が見つかりました。

<urlMappings>
   <add url="~/Data" mappedUrl="Data.svc"/>
</urlMappings>

これには 2 つの問題があります - 1. 複雑に思える 2. 生成された WSDL では、操作エンドポイントは依然として Data/ ではなく Data.svc/ を参照するため、実際に存在して応答する Data.svc に依存します。

たとえそれが問題をある程度解決するとしても、これは私が本当に望んでいることではありません。

拡張子のない WCF サービス URL を取得して WSDL を正しく生成する適切な方法はありますか?

ベストアンサー1

うわー、バカみたいだ。

WebServiceHostFactory ではなく、ServiceHostFactory を使用してサービスをホストする必要がありました。

すぐに config から code に戻り、次のコード行に切り替えました。

RouteTable.Routes.Add(new ServiceRoute("Data", new ServiceHostFactory(), typeof(DataDips)));

私は、WSDL とヘルプ ページを提供する拡張子のない URL を使用してビジネスを行っていました。

これに多くの時間を無駄にしてしまったのは残念です。WebServiceHostFactory を使用していたのは偶然でしたが、MSDN のファクトリ ページには機能の縮小に関する免責事項がありません。(WSDL を削除するのは理にかなっていると思いますが、ヘルプ ページを削除するのは理にかなっていません。その名前の REST 操作がある場合に、構成で属性を提供して 'ヘルプ' ページの名前を変更すればよいだけだからです... ため息)。

WebServiceHostのドキュメントに注記がありますhttp://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

おすすめ記事