簡體   English   中英

使用WCF使用REST服務 - 可選的查詢字符串參數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM