2015-02-06 75 views
0

我正在實施BizTalk 2010 Saleforce集成,我純粹使用企業wsdl調用其方法。沒有任何操作的C#代碼。Biztalk 2010:無法通過企業WSDL查詢SalesForece.Illegal頭問題

我能夠成功地調用登錄方法並獲取所有細節的結果。現在在隨後的請求中,我調用的查詢方法不需要額外的參數來獲取標題。它只是將查詢字符串作爲參數顯示在下面。

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

現在的問題是,當我調用此方法它給我的「無效的會話及非法會話頭」錯誤,因爲沒有頭獲得通過。

替代方案,我試圖構造消息並傳遞標頭與會話標識(從登錄結果中獲取)顯式地如下所示。

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。因此得到相同的結果「無效會話和非法會話頭」。

//從編排調試程序請求,其中顯式傳遞後沒有會話頭,它只接受查詢字符串。

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

從SoapUI工具,當我傳遞相同的XML與會話頭它得到我的結果。

<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

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

,這可能是一個好主意,這頭模板存儲在一個公共常量字符串變量,或者寫一個方法來爲你設置格式 - 假設你將多條消息發送到Salesforce,你將可以更容易地重用它:

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

,並在您的公用事業類,對業務流程中設置SOAP頭像

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

更多信息的方法: https://msdn.microsoft.com/en-us/library/bb246026.aspx(但請注意,你實際上並不需要使用此一個XmlDocument);這適用於2010年,即使它表示2013年。

+0

WCF.OutboundCustomHeaders爲我工作。謝謝大家,感謝你的迴應。 – 2015-02-07 16:30:37

+0

太好了。如果您不介意,請將其標記爲答案,以便將來的用戶能夠更輕鬆地找到答案。謝謝。 – 2015-02-07 18:56:00