c# - 让 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 来处理这些不同的请求类型......
我希望我的解释清楚。
解决方案
每个[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 不能在一个服务中重复。
如果问题仍然存在,请随时告诉我。
推荐阅读
- ios - IOSurfaceClientGetPixelFormat 处的 SIGSEGV(SEGV_ACCERR)
- wso2 - 用于服务的 wso2 微集成器集群 - 创建另一个问题,因为第一个问题已无缘无故关闭
- python - 循环嵌套在循环内,但无法识别顶级循环
- couchbase - 使用 Couchbase map/reduce 视图从所有文档中获取所有子项
- android - 在项目“projectName”中找不到路径为“sdk”的项目
- android - 如何在 XML Android Studio 中创建镜像矩形形状?
- python - 表达两个变量之间的复杂关系
- javascript - 如果用户未使用 Nodejs 登录,如何添加注销按钮
- google-cloud-platform - 从 Redis 到 Memorystore 的迁移挑战
- rust - std::ptr::write 是否传输它写入的字节的“未初始化”?