C# 获取WCF服务以侦听同一URI上不同POST请求的问题
我在让WCF服务监听URI并根据收到的帖子类型进行不同处理时遇到问题 例如: WCF服务是这样公开的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
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不能在服务中重复。
如果问题仍然存在,请随时通知我