[英]Consuming REST Service with WCF - Optional Querystring Parameters?
我在嘗試使用WCF使用簡單服務時遇到問題。 到目前為止,除了實現可選的查詢字符串參數之外,一切都進展順利。 界面看起來有點像這樣:
[ServiceContract]
[XmlSerializerFormat]
public interface IApi
{
[OperationContract]
[WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")]
object GetStuff(string param, int top, DateTime first);
}
然后通過創建繼承ClientBase<IApi>
的類來使用它。 我嘗試了幾種方法使參數可選:
1)使參數可以為空
這沒用。 我從QueryStringConverter
收到一條消息,就像另一個問題一樣: WCF服務合同可以有一個可以為空的輸入參數嗎?
2)URL末尾的一個參數
因此,我考慮將UriTemplate更改為更通用,構建查詢字符串並將其作為參數傳遞。 這似乎也不起作用,因為傳入的值被編碼,使得它不被服務器識別為查詢字符串。
例:
[WebGet(UriTemplate = "/url/{query}")]
3)Hackish Solution
到目前為止我找到的唯一方法是將所有參數更改為字符串,並且這里似乎允許使用NULL。
例:
[WebGet(UriTemplate = "/url/{param}?top={top}&first={first}")]
object GetStuff(string param, string top, string first);
此接口的使用仍接受正確的變量類型,但使用ToString
。 Thes查詢字符串參數仍出現在實際請求中。
那么,使用WCF 消費 REST服務有沒有辦法讓查詢字符串參數可選?
更新 - 如何修復
提出了創建服務行為的建議。 這繼承自WebHttpBehaviour
。 它看起來如下:
public class Api : ClientBase<IApi>
{
public Api() : base("Binding")
{
Endpoint.Behaviors.Add(new NullableWebHttpBehavior());
}
}
NullableWebHttpBehavior
可以在以下Stackoverflow問題中找到: WCF服務契約可以有一個可以為空的輸入參數嗎? 。 唯一的問題是, ConvertValueToString
沒有超載,所以我快速打了一個:
public override string ConvertValueToString(object parameter, Type parameterType)
{
var underlyingType = Nullable.GetUnderlyingType(parameterType);
// Handle nullable types
if (underlyingType != null)
{
var asString = parameter.ToString();
if (string.IsNullOrEmpty(asString))
{
return null;
}
return base.ConvertValueToString(parameter, underlyingType);
}
return base.ConvertValueToString(parameter, parameterType);
}
這可能不完美,但似乎按預期工作。
您的選項1)可以用於WCF客戶端,因為WebHttpBehavior
可以應用於ClientBase(或ChannelFactory)派生類,如此SO問題和答案中所示。 只需將您在1)中引用的代碼與捕獲500響應問題中顯示的配置相結合,即可顯示工作。
你嘗試過使用可空類型嗎?
object GetStuff(string param, int? top, DateTime? first);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.