首页 > 解决方案 > 让 WCF 服务在同一 URI 上侦听不同 POST 请求的问题

问题描述

我在让 WCF 服务侦听 URI 并根据它收到的 POST 类型以不同方式处理时遇到问题...

例子:

WCF 服务就是这样暴露的。

http://localhost/test

上面的端点将接收以下 POST 请求:

POST http://localhost/test HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.25.0
Accept: */*
Cache-Control: no-cache
Host: localhost
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 42

{"input":"example string"}

端点还将在同一 URI 上接收以下 POST 请求:

POST http://localhost/test HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.25.0
Accept: */*
Cache-Control: no-cache
Host: localhost
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 42

{"input":"example string","turtle":"I Love Turtles"}

我希望能够根据请求正文的内容以不同的方式处理请求,我尝试了这个:

    [OperationContract]
    [WebInvoke(Method = "POST",
        UriTemplate = "test/",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]
    string PostWithOneBis(string input,string turtle);
    string PostWithOnePrim(string input);

如前所述,我想根据收到的请求输入第一个函数或第二个函数。我不想设置不同的 URI 来处理这些不同的请求类型......

我希望我的解释清楚。

标签: c#windowswcf

解决方案


每个[OperationContract]只能修改一个方法,所以你的代码没有解决问题,可以让turtle默认值为null来解决这个问题,对于接收到的请求,需要判断turtle是否为空才知道是哪个方法运行,这是一个演示:

班级

    [OperationContract]
    [WebInvoke(Method = "POST",
    UriTemplate = "test/{input}/{turtle=null}",
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
    string PostWithOne(string input, string turtle);

实现类

    public string PostWithOne(string input, string turtle)
    {
        if (turtle == null)  //  string PostWithOnePrim(string input);
        {
            return "string PostWithOnePrim(string input)";
        }
        else
        {            //   string PostWithOneBis(string input,string turtle);
            return "string PostWithOneBis(string input,string turtle)";
        }
    }

我们在 PostWithOne 中判断是使用 PostWithOneBis 方法还是 PostWithOnePrim 方法。

在此处输入图像描述

如果URI中不传参数,PostWithOne会接收到任意的json,还需要判断获取到的json来判断是使用PostWithOnePrim方法还是PostWithOneBis方法。

班级

    [OperationContract]
    [WebInvoke(Method = "POST",
    UriTemplate = "test/",
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
    string PostWithOne(string input, string turtle);

在此处输入图像描述

WCF Rest服务通过URI而不是请求内容来判断不同的请求,因此WCF的PostWithOneBis(字符串输入,字符串turtle)PostWithOnePrim(字符串输入)没有区别。

一个 UriTemplate 和一个 [OperationContract] 只能修改一个方法,并且 UriTemplate 不能在一个服务中重复。

如果问题仍然存在,请随时告诉我。


推荐阅读