私はこれらを試しました
そして
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.
このシナリオには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();
}
}
クエリパラメータを使用したUriTemplate
sのデフォルト値に関する補完的な回答。 @carlosfigueiraが提案するソリューションは、 the docs に従ってパスセグメント変数に対してのみ機能します。
パスセグメント変数のみにデフォルト値を設定できます。クエリ文字列変数、複合セグメント変数、および名前付きワイルドカード変数には、デフォルト値を使用できません。