WCF 和可选参数

发布于 2024-11-03 09:45:18 字数 292 浏览 4 评论 0原文

我刚刚开始将 WCF 与 REST 和 UriTemplates 结合使用。现在可以使用可选参数吗?

如果没有,你们会建议我为一个具有三个参数(始终在 url 中使用)和其他可选参数(数量不同)的系统做什么?

示例:

https://example.com/?id=ID&type=GameID&language=LanguageCode&mode=free 
  • id、类型、语言始终存在
  • 模式是可选的

I just started using WCF with REST and UriTemplates. Is it now possible to use optional parameters?

If not, what would you guys recommend I do for a system that has three parameters that are always used in the url, and others that are optional (varying amount)?

Example:

https://example.com/?id=ID&type=GameID&language=LanguageCode&mode=free 
  • id, type, language are always present
  • mode is optional

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

相权↑美人 2024-11-10 09:45:18

我刚刚用 WCF 4 测试了它,它工作没有任何问题。如果我不在查询字符串中使用模式,我将得到 null 作为参数值:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetData?data={value}&mode={mode}")]
    string GetData(string value, string mode);
}

方法实现:

public class Service : IService
{
    public string GetData(string value, string mode)
    {
        return "Hello World " + value + " " + mode ?? "";
    }
}

对我来说,看起来所有查询字符串参数都是可选的。如果查询字符串中不存在参数,则其类型将具有默认值 => null 表示 string,0 表示 int,等等 MS 还指出应该实现这一点。

无论如何,您始终可以使用 idtypelanguage 定义 UriTemplate 并通过 访问方法内的可选参数WebOperationContext

var mode = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["mode"];

I just tested it with WCF 4 and it worked without any problems. If I don't use mode in query string I will get null as parameter's value:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetData?data={value}&mode={mode}")]
    string GetData(string value, string mode);
}

Method implementation:

public class Service : IService
{
    public string GetData(string value, string mode)
    {
        return "Hello World " + value + " " + mode ?? "";
    }
}

For me it looks like all query string parameters are optional. If a parameter is not present in query string it will have default value for its type => null for string, 0 for int, etc. MS also states that this should be implemented.

Anyway you can always define UriTemplate with id, type and language and access optional parameters inside method by WebOperationContext:

var mode = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters["mode"];
叹倦 2024-11-10 09:45:18

我尝试过在宁静的网络服务中使用可选参数,
如果我们不在参数值中传递任何内容,它将保持为空。之后我们可以检查
函数中的 null 或空。如果它为空,则不要使用它,否则您可以使用它。
假设我有下面的代码

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetSample?part1={part1}&part2={part2}")]
    string GetSample(string part1, string part2);
}

,这里第 1 部分是强制性的,第 2 部分是可选的。
现在该函数看起来像

public class Service : IService
{
    public string GetSample(string part1, string part2)
    {
        if (!string.IsNullOrEmpty(part2))
        {
            return "Hello friends..." + part1 + "-" + part2;
        }
        return "Hello friends..." + part1;
    }
}

您也可以根据您的要求进行转换。

I have tried with optional parameters in restful web service,
If we do not pass anything in parameter value it remains null. After that we can check for
the null or empty in function. If it is null then don't use it, else you can use it.
Let say I have below code

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebGet(UriTemplate = "GetSample?part1={part1}&part2={part2}")]
    string GetSample(string part1, string part2);
}

Here part1 is compulsory and part2 is optional.
Now the function would look like

public class Service : IService
{
    public string GetSample(string part1, string part2)
    {
        if (!string.IsNullOrEmpty(part2))
        {
            return "Hello friends..." + part1 + "-" + part2;
        }
        return "Hello friends..." + part1;
    }
}

You can also make the conversion based on your requirements.

林空鹿饮溪 2024-11-10 09:45:18

你必须使用“?”网址中后跟“/”。

例子:

[WebGet(UriTemplate = "GetSample/?OptionalParamter={value}")]
    string GetSample(string part1);

You have to use "?" followed by "/" in your Url.

example:

[WebGet(UriTemplate = "GetSample/?OptionalParamter={value}")]
    string GetSample(string part1);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文