web-dev-qa-db-ja.com

WebGetを使用したオプションのUriTemplateパラメーター

私はこれらを試しました

WCFサービスURIテンプレートのオプションパラメーター?BlogsのKamal Rawat投稿| 2012年9月4日の.NET 4.5このセクションでは、WCF Servuce URI inShareでオプションパラメーターを渡す方法を示します

そして

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

しかし、私には何も機能しません。ここに私のコードがあります:

    [WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{app}")]
    public string RetrieveUserInformation(string hash, string app)
    {

    }

パラメータがいっぱいになった場合に機能します:

https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df/Apple  

ただし、appに値がない場合は機能しません

https://127.0.0.1/Case/Rest/Qr/RetrieveUserInformation/djJUd9879Hf8df  

appをオプションにします。これを達成する方法は?
appに値がない場合のエラーは次のとおりです。

Endpoint not found. Please see the service help page for constructing valid requests to the service.  
22
fiberOptics

このシナリオには2つのオプションがあります。 *パラメーターでワイルドカード({app})を使用できます。これは、「URIの残り」を意味します。または、{app}部分にデフォルト値を指定できます。これは、存在しない場合に使用されます。

URIテンプレートの詳細については http://msdn.Microsoft.com/en-us/library/bb675245.aspx で確認できます。以下のコードは両方の選択肢を示しています。

public class StackOverflow_15289120
{
    [ServiceContract]
    public class Service
    {
        [WebGet(UriTemplate = "RetrieveUserInformation/{hash}/{*app}")]
        public string RetrieveUserInformation(string hash, string app)
        {
            return hash + " - " + app;
        }
        [WebGet(UriTemplate = "RetrieveUserInformation2/{hash}/{app=default}")]
        public string RetrieveUserInformation2(string hash, string app)
        {
            return hash + " - " + app;
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost Host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        Host.Open();
        Console.WriteLine("Host opened");

        WebClient c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/RetrieveUserInformation/dsakldasda/Apple"));
        Console.WriteLine();

        c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/RetrieveUserInformation/dsakldasda"));
        Console.WriteLine();

        c = new WebClient();
        Console.WriteLine(c.DownloadString(baseAddress + "/RetrieveUserInformation2/dsakldasda"));
        Console.WriteLine();

        Console.Write("Press ENTER to close the Host");
        Console.ReadLine();
        Host.Close();
    }
}
49
carlosfigueira

クエリパラメータを使用したUriTemplatesのデフォルト値に関する補完的な回答。 @carlosfigueiraが提案するソリューションは、 the docs に従ってパスセグメント変数に対してのみ機能します。

パスセグメント変数のみにデフォルト値を設定できます。クエリ文字列変数、複合セグメント変数、および名前付きワイルドカード変数には、デフォルト値を使用できません。

3
Bahaa