在Windows应用程序和Web服务中使用相同的类库

时间:2011-12-10 15:09:59

标签: winforms web-services class

我合作:

类库:Model.dll

using System;
using System.Collections.Generic;
using System.Text;

namespace root
{
    public class Customer
    {
        private int _Id;

        public int Id
        {
            get { return _Id; }
            set { _Id = value; }
        }

        private string _Name;

        public string Name
        {
            get { return _Name; }
            set { _Name = value; }
        }
    }
}

参考Model.dll的ASP.NET Web服务,所以我可以在web方法中使用:

[WebMethod]
public string HelloWorld(root.Customer customer) {
   return "Hello World";
}

参考Model.dll和Web Service(1)的Windows应用程序。

root.Customer newCustomer = new Customer();
newCustomer.Id = 1;
newCustomer.Name = "Name";

ws.Service ws = new root.ws.Service();
ws.HelloWorld(newCustomer);
              ^ problem here

错误:参数'1':无法从'root.Customer'转换为'root.ws.Customer'


(1)右键单击 - >和Web参考 - >此解决方案中的Web服务 - >单击Service.asmx - > 输入网络参考名称: ws - >单击添加引用


更新:我可以从

更改生成的Reference.cs文件中的行
public string HelloWorld(Customer customer)

public string HelloWorld(root.Customer customer)

因此,函数将寻找真实模型而不是代理对象,但不是真正的答案 在每次网络参考更新后,我都不会考虑编辑此文件 如何强制使用真实模型?

2 个答案:

答案 0 :(得分:1)

我担心在自动生成的ASMX代理中重用类型是不可能的。

有三种选择。

1)编写自己的代码生成器,其行为类似于wsdl.exe,即构建Web服务的代理但重用指定的类型

(相当困难)

2)编写自己的代码重写器,重写自动生成的代理以使用您自己的类型。每次构建对Web服务的引用后,您都会调用此类重写器

(仍然乏味)

3)切换到WCF Web服务。 basicHttpBinding上的WCF服务在语义上等同于ASMX Web服务(使用基于http + soap的相同通信协议),但WCF服务元数据包含有关类型的更多信息,以便代理生成器能够重用类型来自参考组件"。

(建议的方法)

答案 1 :(得分:0)

如果您从asmx切换并开始使用WCF的svc模型,您可以在服务器和客户端之间共享库,而不用大惊小怪。如果这是一个选项,那么有足够的资源可以帮助您在线使用WCF。