2016-12-06 45 views
10

Tôi đang nâng cấp từ ColdFusion 9 đến ColdFusion 2016 và các dịch vụ web của tôi đột nhiên không hoạt động nữa. Tôi tin rằng đó là bởi vì Trục 2 đã được giới thiệu trong Cold Fusion 10 và nó kết xuất các dịch vụ web hiện tại của tôi không hoạt động.Dịch vụ web trong ColdFusion 2016 không còn chức năng

Thậm chí nếu tôi đặt phiên bản Dịch vụ web về 1 trong Quản trị viên ColdFusion, nó vẫn không hoạt động.

Con đường tôi gọi đó là các dịch vụ web là với chức năng createObject như vậy:

<cfscript> 
    objSoapHeader = XmlParse("<wsse:Security mustUnderstand=""true"" xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><wsse:UsernameToken><wsse:Username>USERNAME</wsse:Username><wsse:Password>PASSWORD</wsse:Password></wsse:UsernameToken></wsse:Security>"); 

    Application.UserWebService = CreateObject("webservice", PATH & "Requests/UserService.asmx?WSDL"); 
    addSOAPRequestHeader(Application.UserWebService,"","",objSoapHeader,true); 

    // Get the .Net resources 
    Application.NetResources = Application.UserWebService.GetNetResources(); 

</cfscript> 

Các lỗi tôi nhận được là:

Cannot perform web service invocation GetNetResources.

The fault returned when invoking the web service operation is:java.lang.RuntimeException: Error obtaining parser from data source:LanguageHeader cannot be null!

Nó tuyên bố rằng LangaugeHeader không thể là null. WSDL hiển thị hai thông điệp liên quan đến GetNetResources hoạt động:

<wsdl:portType name="UserServiceSoap"> 
    <wsdl:operation name="GetNetResources"> 
     <wsdl:input message="tns:GetNetResourcesSoapIn"/> 
     <wsdl:output message="tns:GetNetResourcesSoapOut"/> 
    </wsdl:operation> 
</wsdl:portType > 

Tuy nhiên khi nhìn vào danh sách các thông điệp tôi có thể thấy ba thông điệp liên quan đến GetNetResources:

<wsdl:message name="GetNetResourcesSoapIn"> 
    <wsdl:part name="parameters" element=tns:GetNetResources"/> 
</wsdl:message> 
<wsdl:message name="GetNetResourcesSoapOut"> 
    <wsdl:part name="parameters" element=tns:GetNetResourcesResponse"/> 
</wsdl:message> 
<wsdl:message name="GetNetResourcesLanguageHeader"> 
    <wsdl:part name="parameters" element=tns:LanguageHeader"/> 
</wsdl:message> 

Nếu hoạt động được chỉ định hai thông điệp, sau đó ở đâu trong tệp WSDL là thông báo thứ ba này được liên kết với hoạt động này?

Dường như tham số LanguageHeader hoàn toàn bắt buộc và được tích hợp trong ColdFusion 2016, vậy tại sao nó hoạt động trong Coldfusion 9 (Axis 1)?

EDIT 1

Để trả lời câu hỏi đầu tiên của tôi ở trên (striked ra) tôi thấy đoạn mã sau trong binding như trái ngược với portType:

<wsdl:binding name="UserServiceSoap" type="tns:UserServiceSoap"> 
    <wsdl:operation name="GetNetResources"> 
     <soap:operation style="document" soapAction="http://tempuri.org/GetNetResources"/> 
     <wsdl:input> 
      <soap:body use="literal"/> 
      <soap:header message="tns:GetNetResourcesLanguageHeader" use="literal" part="LanguageHeader"/> 
     </wsdl:input> 
     <wsdl:output> 
      <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
</wsdl:binding> 

Tuy nhiên điều đó vẫn không trả lời câu hỏi thứ hai của tôi.

EDIT 2

Sau khi chơi đùa với mã một chút, tôi manged để giải quyết RuntimeException bằng cách thêm một biến để gọi dịch vụ web.

args = {TEST="<locale>en-CA</locale>"}; 
Application.NetResources = Application.UserWebService.GetNetResources(argumentCollection=args); 

Mà bây giờ kết quả trong các lỗi sau:

Web service parameter name languageHeader cannot be found in the provided parameters {TEST}.

Như TEST không phải là một tham số thực tế được quy định trong WSDL, tôi sửa đổi nó để languageHeader, và nhận lỗi mới này:

Web service operation GetNetResources with parameters {LANGUAGEHEADER={<locale>en-CA</locale>}} cannot be found.

Điều này cho biết rằng languageHeader thực sự là tên thông số chính xác, tuy nhiên nó vẫn không thể tìm thấy hoạt động dịch vụ web, do đó tôi tin rằng 'loại' tham số khác nhau.

Có lẽ tôi sẽ không giả được gửi một chuỗi như giá trị, tuy nhiên nhìn lại WSDL của tôi, nó khẳng định rằng họ gõ của Locale là một chuỗi:

<wsdl:types> 
    <s:schema targetNamespace="http://tempuri.org/" elementFormDefault="qualified"> 
     <s:element name="LanguageHeader" type="tns:LanguageHeader"/> 
     <s:complexType name="LanguageHeader"> 
      <s:sequence> 
       <s:element name="Locale" type="s:string" maxOccurs="1" minOccurs="0"/> 
      </s:sequence> 
      <s:anyAttribute/> 
     </s:complexType> 
    </s:schema> 
</wsdl:types> 

Từ những gì tôi hiểu rằng tôi giả sử gửi đối tượng complexType làm thông số chứa Locale làm chuỗi.

Tôi sẽ gửi loại đối tượng nào từ CFML nếu trường hợp đó xảy ra?

+0

Không phải là câu trả lời cho câu hỏi của bạn, nhưng bạn đã thực hiện 'refreshWSDL = true' để xác minh nó không phải là điều gì đó ngớ ngẩn như bộ nhớ đệm? :) – Leigh

+0

Tôi có khi tôi thử sử dụng 'cfinvoke' và nó vẫn không hoạt động – MPaul

+0

Ok. Chỉ cần xác minh đối tượng WS thực sự là * re * được tạo với phiên bản 1 (trong phạm vi thích hợp). Tôi không có quyền truy cập vào năm 2016 ngay bây giờ, nhưng nó luôn luôn có thể có một cái gì đó thay đổi. Xin lỗi tôi không thể giúp đỡ nhiều hơn. – Leigh

Trả lời

Các vấn đề liên quan