C# web服务请求调用SOAP请求缺少空参数

C# web服务请求调用SOAP请求缺少空参数,c#,.net,web-services,soap,C#,.net,Web Services,Soap,我对web服务和C#都是新手,所以如果我的问题太简单,请原谅我。我四处搜索,但找不到答案——至少根据我的关键字找到了一个 我试图通过C#(VisualWebDeveloper2010Express)调用web服务,但我得到了一个错误作为响应。当我通过soapUI调用相同的web服务时,我没有得到错误。当我将来自C#的SOAP请求与来自soapUI的SOAP请求进行比较时,C#SOAP请求缺少一个故意为空的参数。当我从soapUI请求中取出空参数时,我得到了相同的错误。对我来说,答案是让C#发送参

我对web服务和C#都是新手,所以如果我的问题太简单,请原谅我。我四处搜索,但找不到答案——至少根据我的关键字找到了一个

我试图通过C#(VisualWebDeveloper2010Express)调用web服务,但我得到了一个错误作为响应。当我通过soapUI调用相同的web服务时,我没有得到错误。当我将来自C#的SOAP请求与来自soapUI的SOAP请求进行比较时,C#SOAP请求缺少一个故意为空的参数
。当我从soapUI请求中取出空参数时,我得到了相同的错误。对我来说,答案是让C#发送参数,即使它是空的。我尝试将其设置为null或“”,但没有效果。有没有办法强迫我的C#web服务客户端发送一个空参数,或者发送所有参数,即使它们没有值

WSDL
到目前为止,我唯一能找到的东西是:

您是否手动生成web引用?您能提供适当的WSDL吗?+我可以更新这个答案



在我看来,SOAP级别上似乎没有多个参数,只有一个参数是XML或字符串参数。getAclUsers是否有多个参数


我承认我的SOAP知识有限,但WSDL中没有列出任何参数。。。也许您正在序列化为XML,而XML序列化选项正是您应该查看的内容?

首先,您可以尝试声明
aclObjectId
属性进行序列化,即使该属性为
null
。为此,您需要找到
类ACLUsersRequest的定义并添加

[System.Xml.Serialization.xmlementAttribute(IsNullable=true)]

为了那笔财产。 这将把它作为

其次,您可以简单地将该属性声明为
string.Empty

EDRSearchServiceSOAPImplClient client = new EDRSearchServiceSOAPImplClient();
var test = client.getACLUsers(
    new ACLUsersRequest() {
        aclName = "my_acl",
        docbase = "qwe",
        aclObjectId=string.Empty },//this should do the trick
    new UserCredentials() {
        userName = "lala",
        password = "123",
        docbase = "qwe" });
这将把它作为
包含到SOAP请求中,它等于


如果这两种方法都不起作用,那么您正在处理非常糟糕的web服务提供商,需要实现自写客户端,该客户端将按照提供商的强制方式格式化消息。

是空值还是类型?出于合同目的,需要知道该类型…该值为空。edmsdev my#u acl@spoonyfork如果没有位于@的导入的WSDL定义类型,则很难回答,因此您可以更好地向我们提供从服务引用生成的C#类以及您使用它们的方式(很明显,在SoapUI中,“aclObjectId”不是可选参数)@ilya dvorovoy我在上面添加了xsd和我的C#代码。我没有为aclObjectId设置值,因为服务的文档说明它是aclObjectId或aclName,而不是两者都是。如果我两个都设置了,我会得到一个回复,说不要设置两个。我想我需要做的是让C#发送一个空的aclObjectId,但我不知道怎么做<代码>aurt.aclObjectId=“”
不会像我希望的那样神奇地在SOAP中放入一个空的
。@spoonyfork您可以检查我的答案,但是当您不提供任何
时,您会收到什么样的错误消息?web引用是指Visual web Developer 2010定义的服务引用吗?如果是,那么就不是了,我使用了添加服务引用向导并提供了WSDL URL。我没有手动生成任何内容。我已经在上面的原始问题中添加了WSDL。相关的部分是getACLUsers。@kieren johnstone我在上面包含了XSD代码,它确实说明了参数。我的问题仍然是我不知道如何从C#发送一个空的
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <getACLUsers xmlns="http://search.services.redacted/">
      <ACLUsersRequest xmlns="">
        <docbase>edmsdev</docbase>
        <aclName>my_acl</aclName>
      </ACLUsersRequest>
      <userCredentials xmlns="">
        <userName>spoonyfork</userName>
        <password>my_password</password>
        <docbase>edmsdev</docbase>
      </userCredentials>
    </getACLUsers>
  </s:Body>
</s:Envelope>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sear="http://search.services.redacted/">
   <soapenv:Header/>
   <soapenv:Body>
      <sear:getACLUsers>
         <!--Optional:-->
         <ACLUsersRequest>
            <docbase>edmsdev</docbase>
            <aclName>my_acl</aclName>
            <aclObjectId></aclObjectId>
         </ACLUsersRequest>
         <!--Optional:-->
         <userCredentials>
            <userName>spoonyfork</userName>
            <!--Optional:-->
            <password>my_password</password>
            <!--Optional:-->
            <wsl4cookie></wsl4cookie>
            <!--Optional:-->
            <endUserForProxyId></endUserForProxyId>
            <!--Optional:-->
            <ip></ip>
            <!--Optional:-->
            <docbase>edmsdev</docbase>
         </userCredentials>
      </sear:getACLUsers>
   </soapenv:Body>
</soapenv:Envelope>
<?xml version="1.0" encoding="UTF-8"?><!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.3-b02-. --><xs:schema xmlns:tns="http://search.services.redacted/" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0" targetNamespace="http://search.services.redacted/">

<xs:element name="getACLUsers" type="tns:getACLUsers"></xs:element>

<xs:element name="getACLUsersResponse" type="tns:getACLUsersResponse"></xs:element>

<xs:element name="getAttributes" type="tns:getAttributes"></xs:element>

<xs:element name="getAttributesResponse" type="tns:getAttributesResponse"></xs:element>

<xs:element name="processSearch" type="tns:processSearch"></xs:element>

<xs:element name="processSearchResponse" type="tns:processSearchResponse"></xs:element>

<xs:complexType name="getACLUsers">
<xs:sequence>
<xs:element name="ACLUsersRequest" type="tns:ACLUsersRequest" minOccurs="0"></xs:element>
<xs:element name="userCredentials" type="tns:UserCredentials" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="ACLUsersRequest">
<xs:sequence>
<xs:element name="docbase" type="xs:string"></xs:element>
<xs:element name="aclName" type="xs:string"></xs:element>
<xs:element name="aclObjectId" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="UserCredentials">
<xs:sequence>
<xs:element name="userName" type="xs:string"></xs:element>
<xs:element name="password" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="wsl4cookie" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="endUserForProxyId" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="ip" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="docbase" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="getACLUsersResponse">
<xs:sequence>
<xs:element name="return" type="tns:ACLUsersResponse" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="ACLUsersResponse">
<xs:sequence>
<xs:element name="user" type="xs:string" maxOccurs="unbounded"></xs:element>
<xs:element name="largeGroups" type="xs:string" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="processSearch">
<xs:sequence>
<xs:element name="searchRequest" type="tns:searchRequest" minOccurs="0"></xs:element>
<xs:element name="userCredentials" type="tns:UserCredentials" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="searchRequest">
<xs:sequence>
<xs:element name="version" type="xs:string"></xs:element>
<xs:element name="docbase" type="xs:string"></xs:element>
<xs:element name="searchCriteria" type="tns:logicalOp" maxOccurs="unbounded"></xs:element>
<xs:element name="maxNumberOfDocuments" type="xs:string"></xs:element>
<xs:element name="folderPaths" type="xs:string" maxOccurs="unbounded"></xs:element>
<xs:element name="metaDataList" type="xs:string" maxOccurs="unbounded"></xs:element>
<xs:element name="objectType" type="xs:string"></xs:element>
<xs:element name="documentLaunchSettings" type="tns:documentLaunchSettings"></xs:element>
<xs:element name="documentACLSettings" type="tns:documentACLSettings"></xs:element>
<xs:element name="oracleHint" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="logicalOp">
<xs:sequence>
<xs:element name="type" type="xs:string"></xs:element>
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="value" type="xs:string"></xs:element>
<xs:element name="logical" type="xs:string"></xs:element>
<xs:element name="relational" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="documentLaunchSettings">
<xs:sequence>
<xs:element name="launcher" type="xs:string"></xs:element>
<xs:element name="useChronicleId" type="xs:boolean"></xs:element>
<xs:element name="showLink" type="xs:boolean"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="documentACLSettings">
<xs:sequence>
<xs:element name="returnACL" type="xs:boolean"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="processSearchResponse">
<xs:sequence>
<xs:element name="return" type="tns:searchResponse" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="searchResponse">
<xs:sequence>
<xs:element name="docbase" type="xs:string" minOccurs="0"></xs:element>
<xs:element name="documents" type="tns:document" nillable="true" minOccurs="0" maxOccurs="unbounded"></xs:element>
<xs:element name="numberOfDocuments" type="xs:string" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="document">
<xs:sequence>
<xs:element name="objectId" type="xs:string"></xs:element>
<xs:element name="linkLocation" type="xs:string"></xs:element>
<xs:element name="metaDataList" type="tns:metaDataItem" maxOccurs="unbounded"></xs:element>
<xs:element name="aclInfo" type="tns:ACLInfo" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="metaDataItem">
<xs:sequence>
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="value" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="ACLInfo">
<xs:sequence>
<xs:element name="ACLName" type="xs:string"></xs:element>
<xs:element name="ACLObjectId" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="getAttributes">
<xs:sequence>
<xs:element name="attributesRequest" type="tns:objectType" minOccurs="0"></xs:element>
<xs:element name="userCredentials" type="tns:UserCredentials" minOccurs="0"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="objectType">
<xs:sequence>
<xs:element name="docbase" type="xs:string"></xs:element>
<xs:element name="objectType" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="getAttributesResponse">
<xs:sequence>
<xs:element name="return" type="xs:string" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
ServiceReference1.UserCredentials uc = new ServiceReference1.UserCredentials();
uc.userName = "spoonyfork";
uc.password = "my_password";
uc.docbase = "edmsdev";

ServiceReference1.ACLUsersRequest aurt = new ServiceReference1.ACLUsersRequest();
aurt.aclName = "my_acl";
aurt.docbase = "edmsdev";

ServiceReference1.EDRSearchServiceSOAPImplClient client = new ServiceReference1.EDRSearchServiceSOAPImplClient();
ServiceReference1.ACLUsersResponse aure = new ServiceReference1.ACLUsersResponse();
aure = client.getACLUsers(aurt, uc);
4.2.1
Applications MAY process invocations with missing parameters but also MAY fail to process the invocation and return a fault.
<operation name="getACLUsers">
    <soap:operation soapAction=""></soap:operation>
    <input>
        <soap:body use="literal"></soap:body>
    </input>
    <output>
        <soap:body use="literal"></soap:body>
    </output>
</operation>
EDRSearchServiceSOAPImplClient client = new EDRSearchServiceSOAPImplClient();
var test = client.getACLUsers(
    new ACLUsersRequest() {
        aclName = "my_acl",
        docbase = "qwe",
        aclObjectId=string.Empty },//this should do the trick
    new UserCredentials() {
        userName = "lala",
        password = "123",
        docbase = "qwe" });