【发布时间】:2018-04-16 14:12:53
【问题描述】:
根据我用来获取引用的 WSDL,我尝试使用的操作定义如下。
出于安全原因,我在所有引用中都将服务名称替换为“MyService”。
<message name="MyService_fetchOperation">
<part name="user" type="xsd:string"/>
<part name="passwd" type="xsd:string"/>
<part name="package" type="xsd:string"/>
<part name="txType" type="xsd:string"/>
<part name="swref" type="xsd:string"/>
<part name="force" type="xsd:string"/>
</message>
我正在用 C# 构建一个请求:
using (var client = new MyService.MyServiceGatewayClient())
{
response = await client.fetchOperationAsync(USER, PASS, PACKAGE, "509", "", "0");
}
在这个问题的上下文中,此请求的作用或用途无关紧要。
请求(来自 Fiddler)如下所示:
POST https://myservice.gateway.thing HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: ""
Host: myservice.gateway.thing
Content-Length: 816
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<ActivityId CorrelationId="04a608d9-fbfd-4a4d-b26b-e57098352dff" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">
80000162-0005-fb00-b63f-84710c7967bb</ActivityId>
<VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">uIDPo6GoRTTueVZOiE2QS303TwoAAAAA6GBrNOg50ESdf6d7KUk2nMLdj/sn/wxCqk4Df+zV1yQACQAA</VsDebuggerCausalityData>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<fetchOperation xmlns="http://myservice.gateway.thing/v1">
<user>TEST9876</user>
<passwd>test4139</passwd><!-- plain text password ftw! -->
<package>SWITCHON</package>
<txType>509</txType>
<swref/>
<force>0</force>
</fetchOperation>
</s:Body>
</s:Envelope>
此请求在服务上返回一个错误,即找不到子元素“用户”。
我已经向服务管理员查询过这个问题,他说我需要重新定义 fetchOperation 标记中的命名空间,并给出了以下示例:
<v1:fetchOperation xmlns:v1="http://myservice.gateway.thing/v1">
...
</v1:fetchOperation>
我有两个问题:
- 为什么需要这样的改变?这将如何解决服务在请求中看不到“缺失”元素的问题?
- 为什么,如果需要此更改,在 VS 中添加服务引用不会生成实际工作的 SOAP 代理?是服务开发人员的不一致还是我做错了什么?
【问题讨论】:
-
我使用生成的代码遇到了同样的问题。命名空间是问题之一。我已经结交了很多客户,只有在使用 .net 的其他语言开发服务时才发现问题。
-
我已经有同样的问题,我解决了使用
svcutil.exe命令行工具生成代理类,像这样:svcutil http://url/servicesvc /Language=c# -
@RicardoPontual 您能否添加一个涵盖您用来执行此操作的步骤的答案?哦,这是在带有 Windows SDK 的 Windows 10 上吗?我现在很遗憾地坚持使用 Windows 8。不过,如果您能提供更多信息,它可能会对其他人有所帮助
-
您没有向我们展示任何 WSDL,并且 xml 的 sn-p 建议面向消息 (Java) 而不是 RPC (.NET) 样式。非常注意您拥有的选项(VS 向导或 cmd 行)。 SvcUtil可以插入一些值得一读的cmets。
标签: c# web-services wcf