根据我用来获取引用的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>
此请求在服务上返回错误,找不到子元素“user”。
我已经向服务管理员询问了这一点,他说我需要在fetchOperation
标记中重新定义命名空间并给出以下示例:
<v1:fetchOperation xmlns:v1="http://myservice.gateway.thing/v1">
...
</v1:fetchOperation>
我有两个问题:
答案 0 :(得分:1)
为服务生成代理客户端的另一种方法是使用 svutil.exe ,这是一个命令行工具,可以从元数据,web或wsdl文件生成服务模型代码。
它包含在 Visual Studio 安装中,您可以打开开发人员命令提示符并执行它:
svcutil http://url/service.svc /Language=c#
您还可以使用 Microsoft Windows SDK 安装svcutil
:https://www.microsoft.com/en-us/download/details.aspx?id=8279
对于一个真实的例子,我使用过这项服务:http://www.chemspider.com/MassSpecAPI.asmx
svcutil http://www.chemspider.com/MassSpecAPI.asmx /Language=c#
生成了MassSpecAPI.cs
文件,位于生成的代理类的一部分下面:
//------------------------------------------------------------------------------
// <auto-generated>
/ ....
// </auto-generated>
//------------------------------------------------------------------------------
[assembly: System.Runtime.Serialization.ContractNamespaceAttribute("http://www.chemspider.com/", ClrNamespace="www.chemspider.com")]
namespace www.chemspider.com
{
using System.Runtime.Serialization;
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.CollectionDataContractAttribute(Name="ArrayOfString", Namespace="http://www.chemspider.com/", ItemName="string")]
public class ArrayOfString : System.Collections.Generic.List<string>
{
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="ECompression", Namespace="http://www.chemspider.com/")]
public enum ECompression : int
{
[System.Runtime.Serialization.EnumMemberAttribute()]
eGzip = 0,
}