web-dev-qa-db-ja.com

WCFのURITemplateのオプションのクエリ文字列パラメータ?

WCF 4.0でいくつかのRESTfulサービスを開発しています。私は以下のようなメソッドを持っています:

[OperationContract]
    [WebGet(UriTemplate = "Test?format=XML&records={records}", ResponseFormat=WebMessageFormat.Xml)]
    public string TestXml(string records)
    {
        return "Hello XML";
    }

そのため、ブラウザを http:// localhost:8000/Service/Test?format = XMLrecords = 1 に移動すると、すべてが実行されます。

しかし、私は http:// localhost:8000/Service/Test?format = XML にナビゲートし、URLの「records = 10」の部分を省略できるようにしたいです。しかし、URIが予期されたURIテンプレートと一致しないため、サービスエラーが発生します。

それでは、クエリ文字列パラメータの一部にデフォルトを実装するにはどうすればよいですか?たとえば、その部分がクエリ文字列から除外されている場合、「レコード」をデフォルトの10にしたいです。

45
Shafique

注:この質問は古くなっています。他の回答をご覧ください。


これはサポートされていないようです。

ただし、Microsoftはこの問題を認識しており、回避策があります。

WebGetまたはWebInvoke属性のUriTemplateからクエリ文字列を省略し、ハンドラー内からWebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParametersを使用してクエリパラメーターの検査、デフォルトの設定などを行うことにより、目的の効果を得ることができます。

https://connect.Microsoft.com/VisualStudio/feedback/details/451296/

53
luksan

this answer によると、これは.NET 4.0で修正されています。クエリ文字列パラメーターを指定しないと、そのタイプのデフォルト値が指定されることになります。

17
Olly

はい、WCF 4.0の後、ここで説明されているようにチャームのように動作することを確認できます WCFおよびオプションのパラメーター

4
JOKe

このブログ投稿をチェックしてください。私には理にかなっており、クエリ文字列パラメーターを解析するクラスが付属しています。

http://blogs.msdn.com/b/rjacobs/archive/2009/02/10/ambiguous-uritemplates-query-parameters-and-integration-testing.aspx

基本的にUriTemplateでクエリ文字列パラメーターを定義しないようにして、パラメーターと一致するかどうかにかかわらず、メソッド実装に存在する場合はサンプルクラスを使用してそれらを取得します。

4
MonkeyWrench

これはWCF 4.0で機能するようです。
「Service1.svc.cs」に必ずデフォルト値を設定してください

public string TestXml(string records)
{
  if (records == null)
      records = "10";

  //... rest of the code
}
2
Navy Seal

これは古い質問ですが、最近のプロジェクトでは時々このシナリオにたどり着きます。

オプションのクエリパラメータを送信するために、 WCF Web Extensions nugetパッケージを作成しました。

インストール後、次のようにパッケージを使用できます。

using (var factory = new WebChannelFactory<IQueryParametersTestService>(new WebHttpBinding()))
{
    factory.Endpoint.Address = new EndpointAddress(ServiceUri);
    factory.Endpoint.EndpointBehaviors.Add(new QueryParametersServiceBehavior());
    using (var client = factory.CreateWebChannel())
    {
        client.AddQueryParameter("format", "xml");
        client.AddQueryParameter("version", "2");
        var result = client.Channel.GetReport();
    }
}

サーバー側では、WebOperationContextを使用してパラメーターを取得できます。

WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters;
0
Cosmin Vană