拡張子なし / .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