C# 获取WCF服务以侦听同一URI上不同POST请求的问题

C# 获取WCF服务以侦听同一URI上不同POST请求的问题,c#,windows,wcf,C#,Windows,Wcf,我在让WCF服务监听URI并根据收到的帖子类型进行不同处理时遇到问题 例如: 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 Accep

我在让WCF服务监听URI并根据收到的帖子类型进行不同处理时遇到问题

例如:

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来处理这些不同的请求类型


我希望我的解释清楚。

每个[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)";
        }
    }
    [OperationContract]
    [WebInvoke(Method = "POST",
    UriTemplate = "test/",
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
    string PostWithOne(string input, string 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)";
        }
    }
    [OperationContract]
    [WebInvoke(Method = "POST",
    UriTemplate = "test/",
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
    string PostWithOne(string input, string turtle);
我们在PostWithOne中判断是使用PostWithOneBis方法还是PostWithOnePrim方法

如果未在URI中传递参数,PostWithOne将接收任何json,您还需要判断获得的json,以确定是使用PostWithOnePrim方法还是PostWithOneBis方法

课程

    [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)";
        }
    }
    [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(字符串输入,字符串海龟)PostWithOnePrim(字符串输入)之间没有区别

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

如果问题仍然存在,请随时通知我