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

Biztalk 2010 : Not able to Query SalesForece through Enterprise WSDL.Illegal Header issue

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

我能够成功调用登录方法并返回包含所有详细信息的结果。现在在随后的请求中,我正在调用查询方法,该方法不采用附加参数来获取 header。它仅将查询字符串作为参数,如下所示。

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

现在的问题是,当我调用此方法时,它给出了 "Invalid Session and Illegal Session Header" 的错误,因为没有 header 通过。

我尝试的替代方法是构建消息并使用 session id(取自登录结果)显式传递 header,如下所示。

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。因此得到相同的结果 "Invalid Session and Illegal Session Header".

//Request From Orchestration Debugger 没有session header显式传递后,只取querystring.

//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>

任何人都可以帮助我并帮助我找到合适的解决方案,以便在所有后续请求中传递 session ID session header.

当我将相同的 xml 与 session header 传递时,从 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>

提前致谢。

使用 (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>";

如果您使用实用程序 class,最好将 header 模板存储在 public const 字符串变量中,或者编写一个方法来格式化为您提供 - 假设您将向 Salesforce 发送多条消息,您将能够更轻松地重复使用它:

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

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

的方法
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 headers 的更多信息: https://msdn.microsoft.com/en-us/library/bb246026.aspx(但请注意,您实际上不必为此使用 XmlDocument);这适用于 2010 年,尽管它说的是 2013 年。