Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF中UriTemplate中的可选参数_Wcf_Optional Parameters_Uritemplate - Fatal编程技术网

WCF中UriTemplate中的可选参数

WCF中UriTemplate中的可选参数,wcf,optional-parameters,uritemplate,Wcf,Optional Parameters,Uritemplate,我在中使用了提示并提供了一个默认值,因此当用户没有指定virutal子目录时,我假设他是指要列出的所有内容。它起作用了 [OperationContract] [WebInvoke(UriTemplate = "GetStuff/{type=all}", ...] IEnumerable<Stuff> GetStuff(String type); [运营合同] [WebInvoke(UriTemplate=“GetStuff/{type=all}”,…] IEnumerable G

我在中使用了提示并提供了一个默认值,因此当用户没有指定virutal子目录时,我假设他是指要列出的所有内容。它起作用了

[OperationContract]
[WebInvoke(UriTemplate = "GetStuff/{type=all}", ...]
IEnumerable<Stuff> GetStuff(String type);
[运营合同]
[WebInvoke(UriTemplate=“GetStuff/{type=all}”,…]
IEnumerable GetStuff(字符串类型);
但是,最好指定一个默认值。但是,默认值(String)为null,我希望发送一个实际值。特别是,我将心放在String.Empty上。但是,我注意到以下情况不起作用。服务器端的条件无法识别空字符串(…其中“type”(ColName)、“all”)中的空字符串

[运营合同]
[WebInvoke(UriTemplate=“GetStuff/{type=String.Empty},…]
IEnumerable GetStuff(字符串类型);

怎么办?

UriTemplate中的默认值不能是空的,但可以有一些表示默认值的内容,在操作中,您可以将其替换为所需的实际默认值,如下所示

public class StackOverflow_17251719
{
    const string DefaultValueMarker = "___DEFAULT_VALUE___";
    const string ActualDefaultValue = "";
    [ServiceContract]
    public class Service
    {
        [WebInvoke(UriTemplate = "GetStuff/{type=" + DefaultValueMarker + "}", ResponseFormat = WebMessageFormat.Json)]
        public IEnumerable<string> GetStuff(String type)
        {
            if (type == DefaultValueMarker)
            {
                type = ActualDefaultValue;
            }

            yield return type;
        }
    }
    public static void SendBodylessPostRequest(string uri)
    {
        HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(uri);
        req.Method = "POST";
        req.ContentType = "application/json";
        req.GetRequestStream().Close(); // no request body

        HttpWebResponse resp;
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
        }
        catch (WebException e)
        {
            resp = (HttpWebResponse)e.Response;
        }

        Console.WriteLine("HTTP/{0} {1} {2}", resp.ProtocolVersion, (int)resp.StatusCode, resp.StatusDescription);
        foreach (string headerName in resp.Headers.AllKeys)
        {
            Console.WriteLine("{0}: {1}", headerName, resp.Headers[headerName]);
        }

        Console.WriteLine();
        Stream respStream = resp.GetResponseStream();
        Console.WriteLine(new StreamReader(respStream).ReadToEnd());

        Console.WriteLine();
        Console.WriteLine("  *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*  ");
        Console.WriteLine();
    }
    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");

        SendBodylessPostRequest(baseAddress + "/GetStuff/nonDefault");
        SendBodylessPostRequest(baseAddress + "/GetStuff");

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
公共类堆栈溢出\u 17251719
{
常量字符串DefaultValueMarker=“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”;
常量字符串ActualDefaultValue=“”;
[服务合同]
公务舱服务
{
[WebInvoke(UriTemplate=“GetStuff/{type=“+DefaultValueMarker+”}”,ResponseFormat=WebMessageFormat.Json)]
公共IEnumerable GetStuff(字符串类型)
{
如果(类型==DefaultValueMarker)
{
类型=实际故障值;
}
收益型;
}
}
公共静态void sendboylesspostrequest(字符串uri)
{
HttpWebRequest req=(HttpWebRequest)HttpWebRequest.Create(uri);
请求方法=“POST”;
req.ContentType=“应用程序/json”;
req.GetRequestStream().Close();//没有请求正文
HttpWebResponse resp;
尝试
{
resp=(HttpWebResponse)req.GetResponse();
}
捕获(WebE例外)
{
resp=(HttpWebResponse)e.Response;
}
WriteLine(“HTTP/{0}{1}{2}”,resp.ProtocolVersion,(int)resp.StatusCode,resp.StatusDescription);
foreach(分别在header.allkey中的字符串headerName)
{
WriteLine(“{0}:{1}”,headerName,resp.header[headerName]);
}
Console.WriteLine();
Stream respStream=resp.GetResponseStream();
Console.WriteLine(新的StreamReader(respStream.ReadToEnd());
Console.WriteLine();
Console.WriteLine(“*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*”;
Console.WriteLine();
}
公共静态无效测试()
{
string baseAddress=“http://“+Environment.MachineName+”:8000/服务”;
WebServiceHost主机=新的WebServiceHost(类型(服务),新的Uri(基地址));
host.Open();
Console.WriteLine(“主机已打开”);
SendBodylessPostRequest(baseAddress+“/GetStuff/nonDefault”);
sendboylesspostrequest(baseAddress+“/GetStuff”);
控制台。写入(“按ENTER键关闭主机”);
Console.ReadLine();
host.Close();
}
}
对我来说,它与“=null”一起工作。我的合同如下所示:

[WebInvoke(UriTemplate = "UploadFile/{fileName}/{patientId}/{documentId}/{providerName=null}", Method = "POST")]

void UploadFile(string fileName, string patientId, string documentId, string providerName, Stream fileContents);

您确实可以向URITemplate添加可选参数。但是,它必须是最后一个参数


仅添加“=”以获取字符串变量为空的默认值时,会抛出消息

UriTemplate“/applications/legal/statuses/{serviceId=}”不可用 有效;UriTemplate变量声明“serviceId=”提供了 路径变量“serviceId”的默认值为空。请注意 UriTemplate路径变量不能绑定到null或空值。 有关更多详细信息,请参阅UriTemplate的文档

而是指定一个默认值,稍后在代码中进行检查:

 UriTemplate = "/applications/legal/statuses/{serviceId=default}"
服务id将是默认值

 UriTemplate = "/applications/legal/statuses/{serviceId=default}"