2

我在这个线程中使用了提示并提供了一个默认值,所以当用户没有指定虚拟子目录时,我假设他的意思是要列出所有的东西。有用。

[OperationContract]
[WebInvoke(UriTemplate = "GetStuff/{type=all}", ...]
IEnumerable<Stuff> GetStuff(String type);

但是,最好指定一个默认值,而不是。但是,default(String),我想发送一个实际值。特别是,我已经把我的心放在了String.Empty上。但是,我注意到以下内容不起作用。服务器端的条件无法识别空字符串(...where 'type' in (ColName, '', 'all'))。

[OperationContract]
[WebInvoke(UriTemplate = "GetStuff/{type=String.Empty}", ...]
IEnumerable<Stuff> GetStuff(String type);

该怎么办?

4

4 回答 4

3

它对我来说与“=null”一起工作。我的合同是这样的:

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

void UploadFile(string fileName, string patientId, string documentId, string providerName, Stream fileContents);
于 2014-08-14T11:19:28.327 回答
0

你不能在 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();
    }
}
于 2013-06-22T17:36:44.720 回答
0

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

使用 WebGet 的可选 UriTemplate 参数

于 2015-09-18T22:17:03.490 回答
0

当仅添加'='以获得字符串变量为空的默认值时,它会抛出消息

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

而是分配一个默认值并稍后在代码中检查:

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

服务 ID 将是默认值。

于 2017-12-20T06:02:00.653 回答