我正在实施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>
先谢谢。
答案 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年。