WCF:WSDL优先的方法:与产生的故障类型问题 [英] WCF: WSDL-first approach: Problems with generating fault types

查看:340
本文介绍了WCF:WSDL优先的方法:与产生的故障类型问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前是在创造一个WCF web服务应当与WS-I Basic Profile的1.1兼容的过程。我使用WSDL优先的方法(实际上是第一次),确定首先在XSD对于复杂类型,WSDL,然后使用svcutil.exe的用于生成根据服务器以及客户端接口/代理。到目前为止,一切工作正常。然后,我决定添加故障以我的WSDL。

I'm currently in the process of creating a WCF webservice which should be compatible with WS-I Basic Profile 1.1. I'm using a wsdl-first approach (actually for the first time), defining first the xsd for the complex types, the WSDL and then using svcutil.exe for generating the according server as well as client-side interfaces/proxies. So far everything works fine. Then I decided to add a fault to my WSDL.

再生与SvcUtil工具成功了,但后来我发现我生成的故障没有我在XSD文件中定义的属性(这是由我的WSDL进口)。

Regenerating with svcutil succeeded, but then I noticed that my generated fault doesn't have the properties I defined in my xsd file (which is imported by my WSDL).

复杂数据类型XSD

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tns="http://myprod.services.mycompany.com/groups_v1.xsd"
    targetNamespace="http://myprod.services.mycompany.com/groupsfault_v1.xsd">

    <xsd:complexType name="groupsFault">
        <xsd:sequence>
            <xsd:element name="code" type="xsd:int"/>
            <xsd:element name="message" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

故障XSD定义

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:tns="http://myprod.services.mycompany.com/groups_v1.xsd"
    targetNamespace="http://myprod.services.mycompany.com/groups_v1.xsd">

    <xsd:complexType name="group">
        <xsd:sequence>
            <xsd:element name="groupDescD" type="xsd:string" />
            <xsd:element name="groupDescI" type="xsd:string" />
            <xsd:element name="groupProtNr" type="xsd:string" />
        </xsd:sequence>
    </xsd:complexType>

</xsd:schema>

使用的 WSDL两个以上的XSD的

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions name="Groups_v1.wsdl"
    targetNamespace="http://myprod.services.mycompany.com/groups_v1.wsdl"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://myprod.services.mycompany.com/groups_v1.wsdl"
    xmlns:fault="http://myprod.services.mycompany.com/groupsfault_v1.xsd"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <xsd:schema targetNamespace="http://myprod.services.mycompany.com/groups_v1.wsdl"
                xmlns="http://www.w3.org/2001/XMLSchema"
                xmlns:groups="http://myprod.services.mycompany.com/groups_v1.xsd">

            <import namespace="http://myprod.services.mycompany.com/groups_v1.xsd" schemaLocation="./Groups.xsd"/>
            <import namespace="http://myprod.services.mycompany.com/groupsfault_v1.xsd" schemaLocation="./GroupsFault.xsd"/>

            <xsd:element name="getGroupList">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="StationProtNr" type="xsd:string" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="getGroupListResponse">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element maxOccurs="unbounded" name="group" type="groups:group" />
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="groupsFault">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="groupsFault" type="fault:groupsFault"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>

        </xsd:schema>
    </wsdl:types>
    <wsdl:message name="getGroupList">
        <wsdl:part element="tns:getGroupList" name="parameters" />
    </wsdl:message>
    <wsdl:message name="getGroupListResponse">
        <wsdl:part element="tns:getGroupListResponse" name="parameters" />
    </wsdl:message>

    <wsdl:message name="groupsFault">
        <wsdl:part name="parameters" element="tns:groupsFault" />
    </wsdl:message>

    <wsdl:portType name="Groups_v1">
        <wsdl:operation name="getGroupList">
            <wsdl:input name="getGroupList" message="tns:getGroupList"/>
            <wsdl:output name="getGroupListResponse" message="tns:getGroupListResponse"/>
            <wsdl:fault name="getGroupListFault" message="tns:groupsFault" />
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="Groups_v1_SOAPBinding" type="tns:Groups_v1">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="getGroupList">
            <soap:operation soapAction="http://myprod.services.mycompany.com/groups_v1/getGroupList" />
            <wsdl:input name="getGroupList">
                <soap:body use="literal" />
            </wsdl:input>
            <wsdl:output name="getGroupListResponse">
                <soap:body use="literal" />
            </wsdl:output>
            <wsdl:fault name="getGroupListFault">
                <soap:fault name="getGroupListFault" use="literal"/>
            </wsdl:fault>
        </wsdl:operation>
    </wsdl:binding>


    <wsdl:service name="getGroupList">
        <wsdl:port binding="tns:Groups_v1_SOAPBinding" name="GroupsSOAP">
            <soap:address location="http://myprod.services.mycompany.com/groups_v1" />
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

生成净错对象

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Xml.Serialization.XmlSchemaProviderAttribute("ExportSchema")]
[System.Xml.Serialization.XmlRootAttribute(IsNullable=false)]
public partial class groupFault : object, System.Xml.Serialization.IXmlSerializable
{

    private System.Xml.XmlNode[] nodesField;

    private static System.Xml.XmlQualifiedName typeName = new System.Xml.XmlQualifiedName("groupFault", "http://sicp.services.siag.it/groups_v1.wsdl");

    public System.Xml.XmlNode[] Nodes
    {
        get
        {
            return this.nodesField;
        }
        set
        {
            this.nodesField = value;
        }
    }

    public void ReadXml(System.Xml.XmlReader reader)
    {
        this.nodesField = System.Runtime.Serialization.XmlSerializableServices.ReadNodes(reader);
    }

    public void WriteXml(System.Xml.XmlWriter writer)
    {
        System.Runtime.Serialization.XmlSerializableServices.WriteNodes(writer, this.Nodes);
    }

    public System.Xml.Schema.XmlSchema GetSchema()
    {
        return null;
    }

    public static System.Xml.XmlQualifiedName ExportSchema(System.Xml.Schema.XmlSchemaSet schemas)
    {
        System.Runtime.Serialization.XmlSerializableServices.AddDefaultSchema(schemas, typeName);
        return typeName;
    }
}

这是正确的?我期望有一个对象创建了一个包含了code和消息ST属性那么你可以通过使用类似

Is this ok?? I'd expect to have an object created that contains properties for "code" and "message" s.t. you can then throw it by using something like

...
throw new FaultException<groupFault>(new groupFault { code=100, message="error" });
...

(遗憾的小写类型定义,但是这会产生从WSDL code)

为什么不svcutil.exe的生成这些属性?? 在网络上的一些消息来源表明,添加 / useSerializerForFaults SvcUtil工具的选项。我试了一下,这是行不通的给我的异常,故障类型缺少对 WSDL:端口类型声明。然而,验证与其他几个工具成功。

Why doesn't the svcutil.exe generate those properties?? Some sources on the web suggested to add the /useSerializerForFaults option of svcutil. I tried it, it doesn't work giving me an exception that the fault type is missing on the wsdl:portType declaration. Validation with several other tools succeeded however.

我的命令行输出(也许这可以帮助别人来识别任何问题):

My command line output (maybe that helps for someone to identify any problems):

C:\>svcutil /out:IGroupsServi
ce.cs /n:*,MyCompany.MyProduct.MyModule /UseSerializerForFaults *.wsdl *.xsd
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 3.0.4506.2152]
Copyright (c) Microsoft Corporation.  All rights reserved.

Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.Se
rviceModel.Description.XmlSerializerMessageContractImporter
Error: The datatype 'http://myprod.services.mycompany.com/groups_v1.wsdl:groupsFault' is
 missing.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://myprod.services.mycompany.com/groups_v1.wsdl']/wsdl:portType[@name='Groups_v1']


Error: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is de
pendent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://myprod.services.mycompany.com/groups_v1.wsdl']/wsdl:portType[@name='Groups_v1']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://myprod.services.mycompany.com/groups_v1.wsdl']/wsdl:binding[@name='Groups_v1_SOAPBinding']


Error: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is depend
ent on.
XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://myprod.services.mycompany.com/groups_v1.wsdl']/wsdl:binding[@name='Groups_v1_SOAPBinding']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://myprod.services.mycompany.com/groups_v1.wsdl']/wsdl:service[@name='getGroupList']/wsdl:port[@name='Gr
oupsSOAP']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata docu
ments did not contain any valid contracts or services
or because all contracts/services were discovered to exist in /reference assembl
ies. Verify that you passed all the metadata documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to
use the /dataContractOnly option.

C:\>

任何帮助是非常 AP preciated :) THX

Any help is VERY appreciated :) thx

推荐答案

我觉得你的问题是,你需要添加将elementFormDefault =合格作为一个属性到xsd:您的WSDL的模式部分。这为我工作。

I think your problem is that you need to add elementFormDefault="qualified" as an attribute to the xsd:schema part of your wsdl. That worked for me.

这篇关于WCF:WSDL优先的方法:与产生的故障类型问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆