1

我有一个 .NET 2 Web 服务,它有一个看起来像这样的单个 Web 方法:

[WebMethod]
public Common.foobar DoSomething(Common.foobar foo)

foob​​ar 类在通用 .NET 2 程序集中定义,该程序集也可用于(作为项目引用)通过服务引用(不是 .NET 兼容性 Web 引用)调用 Web 服务的 .NET 3.5 应用程序。

问题是服务引用命名空间包含它自己的、自动生成的 foobar 实现。因此,代理 SOAP 客户端上可用的自动生成的服务引用方法具有以下签名:

ServiceReference.foobar DoSomething(ServiceReference.foobar foo)

谷歌搜索告诉我这是不可避免的,因为 Web 服务是基于 .NET 2 的,因此不支持像在 WCF 中那样重用公共类。

所以问题是:有人知道将 Common.foobar 类克隆到 WebServiceReference.foobar 类的简单可靠的方法吗?或者,有人知道我可以使用公共库中定义的类的“hack”吗?或者,任何人都可以指出我在哪里错过了树木的木材,事实上可以使用公共图书馆类

编辑-更多信息

.NET 2 webservice 类如下所示:

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class Service1 : System.Web.Services.WebService
{
    [WebMethod]
    public CommonLibrary.Foobar DoSomething(CommonLibrary.Foobar foo)
    {
        return new CommonLibrary.Foobar() { Data = "Data in common foobar class", EventCode = 1, MessageId = "mid" };
    }
}

调用客户端(.NET 3.5 - 带有对 .NET 服务的服务引用)如下所示:

static void Main(string[] args)
{
    // Create the soap client for the .NET 2 service using the auto generated proxy class
    var serviceClient = new NET2WebService_ServiceReference.Service1SoapClient();

    //Just checking that there is a project reference to CommonLibrary
    var commonFoobar_Request = new CommonLibrary.Foobar()
    {
        Data = "Common foobar data",
        EventCode = 1,
        MessageId = "Common foobar message id"
    };

    // This doesn't work as the Service Reference client does not accept the
    // common foobar class.
    /*
    var commonFoobar_Response = serviceClient.DoSomething(commonFoobar_Request);
    Console.WriteLine(commonFoobar_Response.Data);
    */

    // This is the proxy class to foobar generated by the Service Reference
    var serviceRefFoobar_Request = new NET2WebService_ServiceReference.Foobar()
    {
        Data = "Common foobar data",
        EventCode = 1,
        MessageId = "Common foobar message id"
    };

    // This does work as it does uses the autogenerated Foobar class in the service
    // reference
    var serviceRefFoobar_Response = serviceClient.DoSomething(serviceRefFoobar_Request);
    Console.WriteLine(serviceRefFoobar_Response.Data);
}

公共库(也是 .NET 2)中的 foobar 类如下所示:

public partial class Foobar
{
    private string dataField;
    private int eventCodeField;
    private string messageIdField;

    public string Data
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }

    public int EventCode
    {
        get
        {
            return this.eventCodeField;
        }
        set
        {
            this.eventCodeField = value;
        }
    }

    public string MessageId
    {
        get
        {
            return this.messageIdField;
        }
        set
        {
            this.messageIdField = value;
        }
    }
}

并且派生自如下模式:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Foobar">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Data" type="xs:string"/>
                <xs:element name="EventCode" type="xs:int"/>
            </xs:sequence>
            <xs:attribute name="MessageId" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>
</xs:schema>

最后,这是 .NET 3.5 客户端上的服务参考配置页面的屏幕截图:

.NET 3.5 服务配置页面的屏幕截图

您可以从该屏幕截图中看到,服务配置以及客户端项目都知道包含我的 Foobar 类实现的 CommonLibrary。

值得一提的是,上面发布的所有内容都有效,但实际上 foobar 类比此处发布的示例要复杂得多。因此,我渴望找到一个解决方案,我可以在整个框架中使用 Common.foobar,而不必为请求翻译 Common.Foobar => ServiceReference.Foobar,反之亦然。

4

2 回答 2

1

我所读到的有关 ASMX Web 服务的所有内容都表明它们不支持在客户端重用类型的功能。此功能仅在服务是 WCF 服务而不是旧版 ASMX 服务时存在。

也许是因为 WCF 使用了差异序列化程序,但我不确定。

是否可以将您的 ASMX Web 服务转换为 WCF 服务?

于 2011-09-07T13:11:55.560 回答
0

类的重用是客户端的功能,而不是服务器端的功能。如果您的客户端代码引用了相同的程序集,并且您在使用“添加服务引用”时启用了共享,那么这可能会起作用。

于 2011-05-18T18:58:19.383 回答