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 年。
我正在实施 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 年。