2013-09-15 5 views
0

Ниже приведен код WSDL моего сервиса WCF, как вызвать службу Directory.svc из jQuery Ajax? Я попытался вызвать «Directory.svc/LoadStaff» и «Directory.svc/Directory/LoadStaff», но я получал ошибку HTTP 400.Учитывая следующий WSDL, как вызвать метод LoadStaff()?

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions name="Directory" 
        targetNamespace="Directory" 
        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
        xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" 
        xmlns:wsa10="http://www.w3.org/2005/08/addressing" 
        xmlns:tns="Directory" 
        xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" 
        xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
        xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" 
        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
        xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" 
        xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
        xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
        xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" 
        xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
        xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <wsdl:types> 
    <xs:schema elementFormDefault="qualified" 
       targetNamespace="Directory" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     <xs:import namespace="http://schemas.microsoft.com/Message"/> 
     <xs:element name="LoadStaff"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element minOccurs="0" 
         name="domainpath" 
         nillable="true" 
         type="xs:string"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
     <xs:element name="LoadStaffResponse"> 
     <xs:complexType> 
      <xs:sequence> 
      <xs:element name="LoadStaffResult" 
         type="q1:StreamBody" 
         xmlns:q1="http://schemas.microsoft.com/Message"/> 
      </xs:sequence> 
     </xs:complexType> 
     </xs:element> 
    </xs:schema> 
    <xs:schema attributeFormDefault="qualified" 
       elementFormDefault="qualified" 
       targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/"> 
     <xs:element name="anyType" 
        nillable="true" 
        type="xs:anyType"/> 
     <xs:element name="anyURI" 
        nillable="true" 
        type="xs:anyURI"/> 
     <xs:element name="base64Binary" 
        nillable="true" 
        type="xs:base64Binary"/> 
     <xs:element name="boolean" 
        nillable="true" 
        type="xs:boolean"/> 
     <xs:element name="byte" 
        nillable="true" 
        type="xs:byte"/> 
     <xs:element name="dateTime" 
        nillable="true" 
        type="xs:dateTime"/> 
     <xs:element name="decimal" 
        nillable="true" 
        type="xs:decimal"/> 
     <xs:element name="double" 
        nillable="true" 
        type="xs:double"/> 
     <xs:element name="float" 
        nillable="true" 
        type="xs:float"/> 
     <xs:element name="int" 
        nillable="true" 
        type="xs:int"/> 
     <xs:element name="long" 
        nillable="true" 
        type="xs:long"/> 
     <xs:element name="QName" 
        nillable="true" 
        type="xs:QName"/> 
     <xs:element name="short" 
        nillable="true" 
        type="xs:short"/> 
     <xs:element name="string" 
        nillable="true" 
        type="xs:string"/> 
     <xs:element name="unsignedByte" 
        nillable="true" 
        type="xs:unsignedByte"/> 
     <xs:element name="unsignedInt" 
        nillable="true" 
        type="xs:unsignedInt"/> 
     <xs:element name="unsignedLong" 
        nillable="true" 
        type="xs:unsignedLong"/> 
     <xs:element name="unsignedShort" 
        nillable="true" 
        type="xs:unsignedShort"/> 
     <xs:element name="char" 
        nillable="true" 
        type="tns:char"/> 
     <xs:simpleType name="char"> 
     <xs:restriction base="xs:int"/> 
     </xs:simpleType> 
     <xs:element name="duration" 
        nillable="true" 
        type="tns:duration"/> 
     <xs:simpleType name="duration"> 
     <xs:restriction base="xs:duration"> 
      <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?"/> 
      <xs:minInclusive value="-P10675199DT2H48M5.4775808S"/> 
      <xs:maxInclusive value="P10675199DT2H48M5.4775807S"/> 
     </xs:restriction> 
     </xs:simpleType> 
     <xs:element name="guid" 
        nillable="true" 
        type="tns:guid"/> 
     <xs:simpleType name="guid"> 
     <xs:restriction base="xs:string"> 
      <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/> 
     </xs:restriction> 
     </xs:simpleType> 
     <xs:attribute name="FactoryType" 
        type="xs:QName"/> 
     <xs:attribute name="Id" 
        type="xs:ID"/> 
     <xs:attribute name="Ref" 
        type="xs:IDREF"/> 
    </xs:schema> 
    <xs:schema elementFormDefault="qualified" 
       targetNamespace="http://schemas.microsoft.com/Message" 
       xmlns:xs="http://www.w3.org/2001/XMLSchema" 
       xmlns:tns="http://schemas.microsoft.com/Message"> 
     <xs:simpleType name="StreamBody"> 
     <xs:restriction base="xs:base64Binary"/> 
     </xs:simpleType> 
    </xs:schema> 
    </wsdl:types> 
    <wsdl:message name="Directory_LoadStaff_InputMessage"> 
    <wsdl:part name="parameters" 
       element="tns:LoadStaff"/> 
    </wsdl:message> 
    <wsdl:message name="Directory_LoadStaff_OutputMessage"> 
    <wsdl:part name="parameters" 
       element="tns:LoadStaffResponse"/> 
    </wsdl:message> 
    <wsdl:portType name="Directory"> 
    <wsdl:operation name="LoadStaff"> 
     <wsdl:input wsaw:Action="Directory/Directory/LoadStaff" 
        message="tns:Directory_LoadStaff_InputMessage"/> 
     <wsdl:output wsaw:Action="Directory/Directory/LoadStaffResponse" 
        message="tns:Directory_LoadStaff_OutputMessage"/> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="BasicHttpBinding_Directory" 
       type="tns:Directory"> 
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="LoadStaff"> 
     <soap:operation soapAction="Directory/Directory/LoadStaff" 
         style="document"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="Directory"> 
    <wsdl:port name="BasicHttpBinding_Directory" 
       binding="tns:BasicHttpBinding_Directory"> 
     <soap:address location="http://localhost:59440/Directory.svc"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Вот код JQuery я использовал для вызова службы:

$.ajax({ 
url: 'http://localhost:59440/Directory.svc/LoadStaff', 
type: 'GET', 
dataType: "json", 
success: function (data) { 
//nothing to do yet 
}, 
error: function (SOAPResponse) { 
    console.log('oops'); 
} 

});

+0

Вместо того, чтобы разместить весь WSDL (! ** UNFORMATTED ** при этом), разместим ваш код вы используете для вызова службы - скорее всего, что-то неправильно в вашем коде вызова. – Tim

+0

Спасибо, что помогли мне форматировать код Tim. Я действительно новичок в размещении на сайте. – Izzeddeen

+0

Является ли ваша услуга службой SOAP или службой на основе REST? Можете ли вы опубликовать определение своего сервиса и конфигурационные файлы службы/клиента? – Tim

ответ

0

Похоже, вы выполняете HTTP-запрос GET для службы на основе SOAP, которая по своей природе всегда ожидает HTTP POST на основе SOAP-конверта на основе XML.

Как ваш клиент находится в javascript, ваш лучший вариант, вероятно, добавляет конечную точку на основе REST к службе с использованием либо WCF WebGet, либо путем переключения инфраструктуры на ASP.NET WEB API.

Если вы не можете по каким-либо причинам вы могли бы заставить своего javascript-клиента выполнить SOAP-вызов. Обратите внимание, что это оставило бы вас с реализацией клиента, которую было бы довольно сложно поддерживать, а также вызвать другие проблемы, такие как обработка ошибок и т. Д.

Но если вы должно, это может помочь вам в правильном направлении :

var yourSoapEnvelope = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/X......' 

$.ajax({ 
url: yourURL, 
type: "POST", 
dataType: "xml", 
data: yourSoapEnvelope, 
complete: doStuff, 
contentType: "text/xml; charset=\"utf-8\"" 
}); 
+0

Проблема в том, что служба не может быть видна вообще, ни как SOAP, ни как HTTP GET. – Izzeddeen

+0

Служба, которую вы пытаетесь вызвать (согласно предоставленному WSDL), является веб-сервисом на основе SOAP и не ожидает, что HTTP GET будет отправлять ваш код. Таким образом, ожидается ошибка при выполнении GET для URL-адреса «http: // localhost: 59440/Directory.svc/LoadStaff». Что вам нужно сделать, это HTTP POST из SOAP-конверта в URL-адрес «http: // localhost: 59440/Directory.svc» (обратите внимание на отсутствие LoadStaff) – magnus

+0

Или даже лучше, как упоминалось в моем ответе, если у вас есть контроль над сервисом, вы должны изменить его или добавить стиль на основе REST, ожидающий HTTP GET, возвращающего JSON. – magnus

Смежные вопросы