45

WCF4.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 = XML&records = 10に移動すると、すべてが実行されたとおりに機能します。

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

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

4

5 に答える 5

53

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


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

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

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

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

于 2010-06-05T17:00:21.970 に答える
17

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

于 2012-07-11T12:58:09.967 に答える
4

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

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

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

于 2010-09-30T14:23:01.887 に答える
2

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

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

  //... rest of the code
}
于 2013-04-30T10:08:52.547 に答える
0

これは古い質問ですが、最近のプロジェクトでは、このシナリオに時々遭遇します。

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

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

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;
于 2018-11-13T19:41:39.890 に答える