2013-06-22 6 views
2

Я использовал подсказку в this thread и предоставил значение по умолчанию, так что когда пользователь не укажет подкаталог virutal, я делаю предположение, что он имел в виду все вещи, в списке. Оно работает.Необязательный параметр в UriTemplate в WCF

Однако было бы лучше указать значение по умолчанию. Тем не менее, по умолчанию (String) is null, и я бы хотел отправить его фактическое значение. В частности, я положил свое сердце на String.Empty. Однако я заметил, что следующее не работает. Условие на стороне сервера не распознает пустую строку (... где «type» in (ColName, '', 'all')).

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

Что делать?

ответ

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(); 
    } 
} 
+0

Darn ... Спасибо. :) –

3

Он работал с «= null» для меня. Мой контракт выглядит так:

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

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

при добавлении только '=', чтобы получить значение по умолчанию, который является пустым для строковой переменной она бросает сообщение

UriTemplate «/ приложений/юридическое/Статусы/{ServiceID =} 'не действует; объявление переменной UriTemplate 'serviceId =' предоставляет пустое значение по умолчанию для переменной пути 'serviceId' . Обратите внимание: Переменные пути UriTemplate не могут быть связаны с нулевым или пустым значением. Для получения дополнительной информации см. Документацию по UriTemplate.

вместо присвоения значения по умолчанию и проверьте позже в коде:

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

служба идентификатор будет значение по умолчанию.