.NET 3.5 ASMX Web 服务 - 通过 .NET 3.5 服务参考调用 - 通用类重用
Posted
技术标签:
【中文标题】.NET 3.5 ASMX Web 服务 - 通过 .NET 3.5 服务参考调用 - 通用类重用【英文标题】:.NET 3.5 ASMX Web Service - Invoked via .NET 3.5 Service Reference - Common Class Reuse 【发布时间】:2012-08-26 16:48:18 【问题描述】:我有一个 .NET 3.5 Web 服务,它带有一个看起来像这样的 Web 方法:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
using System;
using System.Collections.Generic;
using System.Web.Services;
namespace Webservice1
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService1 : WebService
[WebMethod]
public List<Model.Person> HelloWorld()
var person1 = new Model.Person FirstName = "Champa", LastName = "Chameli", TimeSpan = new TimeSpan(12,10,9,8);
var person2 = new Model.Person FirstName = "Shamu", LastName = "Ramu", TimeSpan = new TimeSpan(12,10,9,8) ;
var persons = new List<Model.Person> person1, person2 ;
return persons;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
using System.Runtime.Serialization;
namespace Model
[DataContract]
public class Person
[DataMember]
public string FirstName get; set;
[DataMember]
public string LastName get; set;
[DataMember]
public System.TimeSpan TimeSpan get; set;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Person 类在通用 .NET 3.5 程序集中定义,该程序集也可用于(作为项目引用)通过服务引用(不是 .NET 兼容性 Web 引用)调用 Web 服务的 .NET 3.5 应用程序。
问题在于服务引用命名空间包含其自己的、自动生成的 Person 实现。因此,代理 SOAP 客户端上可用的自动生成的服务引用方法具有以下签名:
public WebApplication1.WebServiceReference1.Person[] HelloWorld()
我也尝试使用带有 dataContractOnly 选项的 svcutil 命令,但出现错误
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\svcutil" http:///CrossfirePortalServices/Leasing/WebService1.asmx /o:"C:\temp\WebApplication1\WebApplication1\WebService1.cs" /s /tcv:Version35 /r:"c:\temp\WebApplication1\Model\bin\Debug\Model.dll" /language:C# /n:*,RPCommonClasses.Services.WebService1 /dataContractOnly
错误:输入读取自 'http:///CrossfirePortalServices/Leasing/WebService1.asmx' 与其他选项不一致。如果您需要更多帮助,请键入 "svcutil /?"
我渴望找到一种解决方案,让我可以在整个框架中使用 Model 域,而不必将 Model 域中的不同类型转换为 ServiceReference 域中的不同类型来处理请求,反之亦然。
我们也不能将 asmx webservices 更改为 WCF,因为我们的 IT 部门反对它。关于如何完成这项任务的任何建议?
【问题讨论】:
The Person class is defined in a common .NET 3.5 assembly
为什么有这个通用程序集? Webservices 背后的理念是不分享common assembly
我了解,但这些网络服务用于我们的内部应用程序。由于各种与 IT 无关的原因,我们必须使用 Web 服务。
【参考方案1】:
有好消息也有坏消息。好消息是它是可能的并且官方支持。坏消息是它相当复杂。
有关在 Web 引用之间共享类库的示例,请参阅此 MSDN 文章。这同样适用于您的场景。
http://msdn.microsoft.com/en-us/library/Aa480505.aspx
【讨论】:
谢谢库巴。该解决方案将起作用,但我看到了两个问题:这是非常复杂的。湾。这使用 xml 序列化而不是数据合同序列化。我希望我可以在 Visual Studio 2010 中使用“添加服务引用”和“在指定引用的程序集中重用类型”选项而不是“添加 Web 引用”。以上是关于.NET 3.5 ASMX Web 服务 - 通过 .NET 3.5 服务参考调用 - 通用类重用的主要内容,如果未能解决你的问题,请参考以下文章
选择啥? .net 3.5 中的 ASMX Web 服务或 WCF?
通过 JSON 对象将 Session 对象中的字节数组传递给 Web 服务(Asp.Net 2.0 asmx)
无法从 .net 中的 Ajax 调用 .asmx Web 服务