我有一个 .NET 2 Web 服务,它有一个看起来像这样的单个 Web 方法:
[WebMethod]
public Common.foobar DoSomething(Common.foobar foo)
foobar 类在通用 .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 客户端上的服务参考配置页面的屏幕截图:
您可以从该屏幕截图中看到,服务配置以及客户端项目都知道包含我的 Foobar 类实现的 CommonLibrary。
值得一提的是,上面发布的所有内容都有效,但实际上 foobar 类比此处发布的示例要复杂得多。因此,我渴望找到一个解决方案,我可以在整个框架中使用 Common.foobar,而不必为请求翻译 Common.Foobar => ServiceReference.Foobar,反之亦然。