标签: wsdl

如何在WCF中接受基类型的集合

安装程序

我有一个WCF服务,它暴露了一个基类型(例如Animal)以及一些派生类型(例如Lion,Tiger和Bear).另一种类型(例如,Zoo)包括属性,该属性是基类型的集合.基类型是具体的,而不是抽象的,因此集合包含基类型和/或派生类型(以任意组合)的实例是完全可以接受的.例如:

[DataContract, KnownType(typeof(Lion)),
KnownType(typeof(Tiger)), KnownType(typeof(Bear))]
public class Animal
{
    [DataMember]
    public string Species { get; set; }
}

[DataContract]
public class Lion : Animal { }


[DataContract]
public class Tiger : Animal { }


[DataContract]
public class Bear : Animal { }

[DataContract]
public class Zoo 
{
    [DataMember]
    public List<Animal> Animals { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我的一个服务操作接受此类型作为其参数,如下所示:

[ServiceContract]
public interface IZooService
{
    [OperationContract]
    void SetZoo(Zoo zoo);
}
Run Code Online (Sandbox Code Playgroud)

所有这些都很好,并且发出的WSDL对我来说看起来非常好.它包含所有类型,并正确指示派生类型从基类型继承.所以,我应该能够使用SOAP消息调用我的服务,如下所示:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:z="http://zoo.org">
   <soapenv:Header/>
   <soapenv:Body>
      <z:SetZoo>
         <z:Zoo>
            <z:Animals>
               <z:Animal> …
Run Code Online (Sandbox Code Playgroud)

collections wcf inheritance soap wsdl

2
推荐指数
1
解决办法
1631
查看次数

Soap WSDL ComplexType被发布为错误的参数类型

我有一个服务器(SoapUI)回答WSDL的请求.

发送测试请求时,我的服务器代码正在接收一个参数列表,但我试图实现的是一个复杂类型单个参数,例如:

{
 ingredient_id   => INT
 something       => STRING
 ...
}
Run Code Online (Sandbox Code Playgroud)

我的类型如下:

  <wsdl:types>
    <xsd:schema targetNamespace="/ingredient">
      <xsd:element name="getIngredientInfo" type="tns:IngredientRequest"></xsd:element>
      <xsd:element name="getIngredientInfoResponse" type="tns:ingredient"></xsd:element>

      <xsd:complexType name="ingredient">
        <xsd:sequence>
            <xsd:element name="ingredient_id" type="xsd:int" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="ingredient_name" type="xsd:string" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_gm" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_vegan" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="status_vegetarian" type="xsd:boolean" minOccurs="1" maxOccurs="1"></xsd:element>
            <xsd:element name="author_id" type="xsd:int" block="#all" minOccurs="1" maxOccurs="1"></xsd:element>
        </xsd:sequence>
      </xsd:complexType>

      <xsd:complexType name="IngredientRequest">
        <xsd:sequence>
            <xsd:element name="ingredient_id" type="xsd:int"></xsd:element>
            <xsd:element name="something" type="xsd:string"></xsd:element>
        </xsd:sequence>
      </xsd:complexType>

    </xsd:schema>
  </wsdl:types>
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我理解为什么WSDL使SoapUI将参数作为简单参数列表而不是单个复杂参数发送?

编辑:这可能是序列标签的一些问题,但我找不到问题,只需要一些亮点.提前致谢!


当然,我就在这里:

<?xml …
Run Code Online (Sandbox Code Playgroud)

xsd soap wsdl web-services

2
推荐指数
1
解决办法
2万
查看次数

为什么无法查看WCF服务的WSDL的内容?

当我导航到WCF svc页面https://mywebstie.project.com/myproject/myuploadservice.svc时,我按预期命中了svc,但是它提供的svcutil URL使用了实际的服务器名称;例如,而不是mywebsite.project.com URL。

当我按所提供的指向WSDL文件的链接时,浏览器中仅呈现文本https://mywebstie.project.com/myproject/myuploadservice.svc/SQLMembershipProvider。浏览器中的URL实际上是使用服务器名称而不是mywebstie.project.com。

WSDL XML的内容未呈现。

可能是什么问题?我没有更改客户端或服务器的配置,但是我的服务无法正常工作。

收到对https://mywebstie.project.com/myproject/myuploadservice.svc/SqlMembershipProvider的HTTP响应时发生错误。这可能是由于服务端点绑定未使用HTTP协议。这也可能是由于服务器终止了HTTP请求上下文(可能是由于服务关闭了)。有关更多详细信息,请参见服务器日志。

这是我的服务器配置

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MembershipBehaviour">
          <serviceMetadata httpsGetEnabled="true" />
          <serviceCredentials>
            <serviceCertificate findValue="44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44 44"
              storeLocation="LocalMachine" storeName="My" x509FindType="FindByThumbprint" />
            <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
              membershipProviderName="SqlMembershipProvider" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="SqlMembershipProvider">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </wsHttpBinding>
      <mexHttpsBinding>
        <binding name="mex" />
      </mexHttpsBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MembershipBehaviour" name="Test.Web.Services.MyUploadService"> …
Run Code Online (Sandbox Code Playgroud)

wcf wsdl endpoint

2
推荐指数
1
解决办法
3369
查看次数

如何查看为wcf函数生成的WSDL

我有一个WCF服务.我是从另一个部门的xsd文件构建的.它生成的只是类,我修改它以匹配我们的"标准".我需要看看该函数的wsdl是否与xsd匹配,实际上其中一个输入的wsdl与它们给我们的匹配.

http://localhost:26535/EDeliveryOrderSvc.svc?wsdl
Run Code Online (Sandbox Code Playgroud)

显示整个服务的wsdl.我的功能部分:

    <wsdl:operation name="CreateOrUpdateOSSOrdersFromEntityInput">
      <soap:operation soapAction="http://[redacted]/EDeliveryOrderSvc/CreateOrUpdateOSSOrdersFromEntityInput" style="document" /> 
 <wsdl:input>
  <soap:body use="literal" /> 
  </wsdl:input>
 <wsdl:output>
  <soap:body use="literal" /> 
  </wsdl:output>
  </wsdl:operation>
Run Code Online (Sandbox Code Playgroud)

没有告诉我有关输入参数的任何信息.我错过了一些简单的事吗?

wcf wsdl

2
推荐指数
1
解决办法
3017
查看次数

无法让Savon形成正确的XML

我之前使用过SOAP,但很多年前,如果我能帮助它,我会尽量保持清醒.

短篇故事...

  • 使用"Soap Client"OS X应用程序,我可以得到我想要的响应.
  • 如果我使用client.request :foo_web_serivce, :language_count, :body => { :foo_app_id => "...", :session_id => "..." }然后我得到一个,Status 200但我的结果是-1因为我认为app_id无法识别.
  • 如果我尝试复制Soap Client call(<LanguageCount>)而不是Savon的call(<foo_web_service:LanguageCount>),那么我得到一个Status 500.

请提前告知并提前致谢.

很长的故事...

使用SOAP客户端我可以看到正确的请求XML是:

User-Agent: Mac OS X; WebServicesCore (357)
Content-Type: text/xml
Host: redacted
Soapaction: http://tempuri.org/redacted/LanguageCount

<?xml version="1.0" encoding="utf-8"?>
  <SOAP-ENV:Envelope
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
      <SOAP-ENV:Body>
        <LanguageCount xmlns="http://tempuri.org/">
          <fooAppID xsi:type="xsd:string">12345678-1234-1234-1234-123456789123</fooAppID>
          <sessionID xsi:type="xsd:string">12345678-1234-1234-1234-123456789123</sessionID>
        </LanguageCount>
      </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在控制台中这样做时:

ruby-1.8.7-p302 > client = Savon::Client.new do |wsdl, http, wsse|
ruby-1.8.7-p302 …
Run Code Online (Sandbox Code Playgroud)

ruby soap wsdl savon

2
推荐指数
1
解决办法
3258
查看次数

绑定在现有项目中的新SOAP请求失败

我已经向已经使用了大量SOAP请求的现有项目添加了一个新的SOAP请求.他们都很好.我以完全相同的方式添加我的新代码(通过Apache CXF从WSDL生成的代码),但不知何故它失败了.

我收到此错误:

javax.xml.ws.WebServiceException: Could not find wsdl:binding operation info for web method foo.
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:113)
    at $Proxy51.foo(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

这是一个Grails项目,代码调用如下:

FooRequest request = new FooRequest()
processResponse(order) { getPort().foo(request) }
Run Code Online (Sandbox Code Playgroud)

它是底部的getPort().foo(),显然是失败的.事实上,我认为不是调用失败,而是闭包的创建,因为processResponse()似乎没有被执行(我在该方法的第一行放了一个println). 编辑:这是关闭的执行失败,而不是创建.所以它真的找不到getPort().foo(),尽管我生成的接口确实有这个方法:

public nl.wecompany.portal.webserviceQopi.QOPIResponse foo(
    @WebParam(name = "in", targetNamespace = "")
    com.myproject.FooRequest in
);
Run Code Online (Sandbox Code Playgroud)

getPort()返回一个org.apache.cxf.jaxws.JaxWsClientProxy@41079622,它也可以用于其他SOAP请求(有效的请求).

我在新代码和现有代码之间找不到任何有意义的区别.什么想法可能是错的?关于在哪里看的任何建议?

编辑:port.metaClass.methods*.name.sort().unique()包含我的新foo()方法.然而,当我调用它时,我得到了这个奇怪的wsdl:binding错误,并且该方法没有被执行(它没有到达第一行的println).

编辑:匿名化我打算匿名的一些东西.

grails binding soap wsdl cxf

2
推荐指数
1
解决办法
8400
查看次数

SoapClient LibXMLError:无法加载外部实体,SOAP-ERROR:解析WSDL:无法加载

我正在尝试使用以下PHP代码建立SOAP连接,并且它在SoapClient构造点处失败:

// Need to declare these settings here because our php.ini has alternate
// settings due to global purposes for other PHP scripts
ini_set("soap.wsdl_cache_enabled", "0");
ini_set("soap.wsdl_cache", "0");
ini_set("display_errors","On");
ini_set("track_errors","On");

// FedEx web services URL, note the HTTPS
$path_to_wsdl = 'https://wsbeta.fedex.com/web-services';

$soap_args = array(
    'exceptions'=>true,
    'cache_wsdl'=>WSDL_CACHE_NONE,
    'trace'=>1)
;

try {
    $client = new SoapClient($path_to_wsdl,$soap_args);
} catch (SoapFault $e) {
    var_dump(libxml_get_last_error());
    echo "<BR><BR>";
    var_dump($e);
}
Run Code Online (Sandbox Code Playgroud)

这输出:

object(LibXMLError)#1 (6) {
    ["level"]=> int(1)
    ["code"]=> int(1549)
    ["column"]=> int(0)
    ["message"]=> string(71) "failed to load external entity …
Run Code Online (Sandbox Code Playgroud)

php xml soap wsdl web-services

2
推荐指数
1
解决办法
3万
查看次数

如何访问SoapUI中的wsdl URL,该URL需要用户名/密码?

如何访问wsdl URL SOAPUI,其中需要用户名/密码?

http://localhost:8080/ws/hello1?wsdl

wsdl soapui

2
推荐指数
1
解决办法
1万
查看次数

无法在SOAPUI中导入WSDL文件 - 弹出NT身份验证(加载WSDL时出错)

我之前从未遇到类似的问题,

我尝试使用SOAP 4.0.1以及SOAP 5.1.2.我在Windows上尝试了它,但在Windows Server 2008上我尝试导入WSDL:提供了NT身份验证对话框: 指定NT身份验证凭据 以填充用户名,密码,域

我能够在Firefox中打开WSDL定义:

http://192.168.0.242/SO/Services/ScheduleService.svc?wsdl 
Run Code Online (Sandbox Code Playgroud)

输入用户名和密码后

但在尝试导入WSDL文件或尝试使用位置URL导入wsdl文件时

Error loading WSDL
There was something wrong with the WSDL you are trying to import

    Error loading
 [http://192.168.0.242/SO/Services/ScheduleService.svc?wsdl=wsdl0]: org.apache.xmlbeans.XmlException: 
org.apache.xmlbeans.XmlException: error: Reference to undefined entity: raquo
Run Code Online (Sandbox Code Playgroud)

java wsdl web-services soapui soap-client

2
推荐指数
1
解决办法
1万
查看次数

Node-soap无法找到调度方法

我正在尝试使用node-soap来使用SOAP api.我刚刚运行了一些localhost测试.

这是我的wsdl:http://hastebin.com/orenizosay.xml

这是我的XSD(来自WSDL):http://hastebin.com/zaqogicabo.xml

public class InsulinEndpoint {

    public static void main(String[] argv) {

        Insulin insulin = new Insulin ();
        String address = "http://localhost:8081/insulin/";
        Endpoint.publish(address, insulin);
        System.out.println("Webservices online at: " + address);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的节点测试应用程序.客户端已成功创建,client.describe()正确显示方法.

soap.createClient(url, function(err, client) {
    if (err) throw err;

    client.backgroundInsulinDose({arg0: 10}, function(err, result) {
         if(err)
            console.error(err);
        else
            console.log(result);
    });
});
Run Code Online (Sandbox Code Playgroud)

但是当我尝试调用backgroundInsulinDose时,我的回答是

<faultstring>Cannot find dispatch method for {}backgroundInsulinDose</faultstring>
Run Code Online (Sandbox Code Playgroud)

而且我的node-soap发送的XML消息是

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:tns="http://server/"><soap:Body><backgroundInsulinDose><arg0>10</arg0></backgroundInsulinDose></soap:Body></soap:Envelope>--------------------
Run Code Online (Sandbox Code Playgroud)

soap wsdl jax-ws node.js

2
推荐指数
1
解决办法
1323
查看次数

标签 统计

wsdl ×10

soap ×6

wcf ×3

web-services ×3

soapui ×2

binding ×1

collections ×1

cxf ×1

endpoint ×1

grails ×1

inheritance ×1

java ×1

jax-ws ×1

node.js ×1

php ×1

ruby ×1

savon ×1

soap-client ×1

xml ×1

xsd ×1