Biztalk 2010:无法通过Enterprise WSDL.Illegal Header问题查询SalesForce

时间:2015-02-06 08:02:40

标签: wsdl salesforce integration biztalk

我正在实施BizTalk 2010 Saleforce集成,我纯粹使用企业wsdl来调用它的方法。任何操作都没有C#代码。

我成功地能够调用登录方法并获得所有详细信息的结果。现在在我调用查询方法的后续请求中,该方法不需要额外的参数来获取头。它只将查询字符串作为如下所示的参数。

<element name='query'>
    <complexType>
      <sequence>
        <element name='queryString' type='string' />
      </sequence>
    </complexType>
  </element>

现在的问题是,当我调用此方法时,它给出了“无效会话和非法会话标题”的错误,因为没有标题传递。

我尝试的替代方法是构造消息并使用会话ID(从登录结果中获取)明确传递标头,如下所示。

Option 1.

varXMLDocument = new System.Xml.XmlDocument(); 
varXMLDocument.LoadXml("<ns0:Envelope xmlns:ns0='http://QuerySFDCVIAWSDL.QueryRequestSchema'><Body><query><queryString>SELECT "some fields xyz..." FROM Quote</queryString></query></Body></ns0:Envelope>");

msgSendQryToSalesforce = varXMLDocument;

//Setting  Header
msgSendQryToSalesforce(WCF.Headers) = "<ns0:SessionHeader xmlns:ns0=\"urn:enterprise.soap.sforce.com\"><ns0:sessionId>" + SessionId + "</ns0:sessionId></ns0:SessionHeader>";

Option 2.

//Creating session header in same xml.
varXMLDocument.LoadXml("<ns0:Envelope xmlns:ns0='http://QuerySFDCVIAWSDL.QueryRequestSchema'><Header><SessionHeader><sessionId>"+SessionId+"</sessionId></SessionHeader></Header><Body><query><queryString>SELECT "some fields xyz..." FROM Quote</queryString></query></Body></ns0:Envelope>");

这些方法的问题是SessionHeader在运行时被删除,只有查询字符串被传递给SFDC。因此获得相同的结果“无效会话和非法会话标题”。

//从Orchestration Debugger请求显式传递后没有会话头,它只接受查询字符串。

//Final Request
<ns0:query xmlns:ns1="urn:sobject.enterprise.soap.sforce.com" xmlns:ns0="urn:enterprise.soap.sforce.com"><ns0:queryString>SELECT "some fields xyz..." FROM Quote</ns0:queryString></ns0:query>

任何人都可以帮助我并帮助我找到合适的解决方案,以便在随后的所有请求中都能在会话标题中传递会话ID。

当我使用会话标题传递相同的xml时,从SoapUI工具中获取结果。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
   <soapenv:Header>     
      <urn:SessionHeader>         <urn:sessionId>some id.......</urn:sessionId>
      </urn:SessionHeader>
   </soapenv:Header>
   <soapenv:Body>
      <urn:query>
         <urn:queryString>Select "some fields xyz..." from Quote</urn:queryString>
      </urn:query>
   </soapenv:Body>
</soapenv:Envelope>

无法理解为什么BizTalk无法正常工作。

仅供参考我的queryRequestSchema

Just FYI my queryRequestSchema

<?xml version="1.0"?>
<xs:schema targetNamespace="http://QuerySFDCVIAWSDL.QueryRequestSchema" xmlns="http://QuerySFDCVIAWSDL.QueryRequestSchema" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Envelope">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Header">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="SessionHeader">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="sessionId" type="xs:string"></xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Body">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="query">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="queryString" type="xs:string"></xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

先谢谢。

1 个答案:

答案 0 :(得分:1)

使用(WCF.CustomOutboundHeaders)上下文属性。

替换此行:

//Setting  Header
msgSendQryToSalesforce(WCF.Headers) = "<ns0:SessionHeader xmlns:ns0=\"urn:enterprise.soap.sforce.com\"><ns0:sessionId>" + SessionId + "</ns0:sessionId></ns0:SessionHeader>";

有了这个

// Setting Header
msgSendQryToSalesforce(WCF.OutboundCustomHeaders) = "<ns0:SessionHeader xmlns:ns0=\"urn:enterprise.soap.sforce.com\"><ns0:sessionId>" + SessionId + "</ns0:sessionId></ns0:SessionHeader>";

如果您正在使用实用程序类,最好将该标头模板存储在公共const字符串变量中,或者编写一种方法为您设置格式 - 假设您要向Salesforce发送多条消息,您将能够更轻松地重复使用它:

msgSendQryToSalesforce(WCF.OutboundCustomHeaders) = Utilities.GetSalesforceHeader(SessionId);

并在您的实用程序类中,有一个类似

的方法
public static string GetSalesforceHeader(string sessionId)
{
    return "<ns0:SessionHeader xmlns:ns0=\"urn:enterprise.soap.sforce.com\"><ns0:sessionId>" + sessionId + "</ns0:sessionId></ns0:SessionHeader>";
}

有关在Orchestrations中设置SOAP标头的更多信息: https://msdn.microsoft.com/en-us/library/bb246026.aspx(但请注意,您实际上不必为此使用XmlDocument);这适用于2010年,尽管它表示2013年。