【问题标题】:How can I Use (Share) Datacontract or Datatype between multiple WCF service and web side如何在多个 WCF 服务和 Web 端之间使用(共享)Datacontract 或 Datatype
【发布时间】:2018-07-09 00:47:22
【问题描述】:

我有一个名为 SERVICE_ABC 的服务项目。

(You can download my example project in this link)

在这个项目中,我定义了 3 个 WCF 服务:

  • Service_A
  • Service_B
  • Service_C

这 3 个服务在 SERVICE_ABC 项目中使用相同的数据协定类。例如这 3 个使用 PersonelDTO 类作为数据契约的服务。

我的问题是这样的:如果我调用返回 PersonelDTO 类型的服务函数,我必须得到这个结果:

ServiceReference_A.PersonelDTO DataA = clientA.GetMyData();
ServiceReference_B.PersonelDTO DataB = clientB.GetMyData();
ServiceReference_C.PersonelDTO DataC = clientC.GetMyData();

但我想这样定义:

PersonelDTO DataA = clientA.GetMyData();
PersonelDTO DataB = clientB.GetMyData();
PersonelDTO DataC = clientC.GetMyData();

(如果我这样做,Visual Studio 会给出一个错误,例如“PersonelDTO 是 ServirceA、ServiceB 和 ServiceC 之间的模糊引用”) 也就是说,我只想在 MVC 控制器中使用一种数据类型。因为 PersonelDTO 类在 SERVICE_ABC 项目中是相同的。所以我不想像 blabla1.PersonelDTO , blabla2.PersonelDTO 那样专门化每个 PersonelDTO

我该怎么做?

【问题讨论】:

  • 我已经阅读了这篇文章,但我不明白如何使用 svcutl
  • svcutil /dconly 这个代码在本文中没有明确。
  • 路径,您的类库的 dll 文件位于您的 PC 示例中的位置(C:/documents/VSrpojects/service_abc/myclasslibrary/bin/debug/myclasslibrary.dll)
  • svcutil /dconly C:/documents/VSrpojects/service_abc/myclasslibrary/bin/debu‌​g/myclasslibrary.dll‌​

标签: c# wcf web sharing datacontract


【解决方案1】:

我自己找到了解决方案。 (但我必须说,你的答案很弱。)

解决方案: 1-) 首先我们必须生成一个新的类库。右键单击主服务解决方案并选择
添加 > 添加项目 > 类库并命名为 SampleLibrary

2-)在该类库中生成所有数据传输对象类(DTO 类)。 (例如 右键单击 > 添加 > 类并给出名称 PersonelDTO.cs)

3-) 右键单击​​类库,然后单击“重建”按钮。

4-) 现在我们构建 SampleLibrary.dll 文件。我们将在我们的服务解决方案和 MVC Web 解决方案中使用这个 .dll 文件。首先,

选择 SERVICE_ABC 解决方案 > 参考并右键单击。选择添加参考 > 浏览选项卡 > 单击浏览按钮

5-) 在浏览窗口中,选择 SampleLibrary.dll 并将此文件添加到 WCF 服务作为参考。 (您可以在 C:\test\SERVICE_ABC\SampleLibrary\bin\Release\SampleLibrary.dll 或 ...\Debug\SampleLibrary.dll 路径中找到此文件。如果您将项目构建为调试模式,您将在 Debug 文件夹中获取它。如果您构建为发布模式,.dll 文件将在发布文件夹中)

6-) 在 WCF 服务中使用类库的数据传输对象文件。 例如在服务中定义如下:

public FooDTO GetFoo()
    {            
        return new SampleLibrary.FooDTO() { Name = "Service A" };
    }

    public BarDTO GetBar()
    {
        //or add using SampleLibrary; definition begining of the pages 
        //and write just as BarDTO without SampleLibrary.BarDTO
        return new BarDTO() { Name = "Service A" };
    }

7-) 重建并运行您的 WCF 服务。 (Service_ABC)

8-) 复制 SampleLibrary.dll 文件,该文件由 WCF Services 在 Service\bin 中构建 文件夹。 (例如,您可以在 C:\test\SERVICE_ABC\SERVICE_ABC\bin 文件夹中找到它)

9-) 将此 SampleLibrary.dll 文件粘贴到 MVC Web 解决方案的 bin 文件夹中。 (例如,您可以在 C:\test\WEB_ABC\WEB_ABC\bin 文件夹中找到它)

10-) 选择您的 Web Mvc 解决方案 > 参考并右键单击 > 添加参考 > 浏览选项卡 > 浏览按钮

11-) 选择我们在步骤 9 中粘贴的 SampleLibrary.dll,然后将此 dll 文件作为参考添加到您的 Web Mvc 解决方案中。

12-) 关闭您的 Web 解决方案并重新打开它。 (因为当您运行更新服务参考命令时,解决方案无法正确设置重用数据类型。您必须重新启动 Vusial Studio 才能重新加载所有 dll 文件)

13-) 右键单击​​您的服务引用(在上图中:ServiceReference_A、ServiceReference_B 或 ServiceReference_C)并选择“更新服务引用”
(请确保:在所有引用的程序集中重用类型选项已选中,如果您不知道已选择,然后右键单击您的服务引用并选择配置服务引用并在打开的窗口中找到它)

所有这一切.. 在这个过程之后,我的 WCF 服务 (SERVICE_ABC) 和我的 Web Mvc 项目使用相同的类库 dll 文件。如果我在 SERVICE_ABC 中定义了多个服务,并且我在 MVC 端使用相同的类型定义得到它。 即这些代码现在可以正常工作..

//ServiceReference_A.PersonelDTO DataA = clientA.GetMyData();//old
//ServiceReference_B.PersonelDTO DataB = clientB.GetMyData();//old 
//ServiceReference_C.PersonelDTO DataC = clientC.GetMyData();//old

PersonelDTO DataA = clientA.GetMyData();//new definition
        PersonelDTO DataB = clientB.GetMyData();//new definition
        PersonelDTO DataC = clientC.GetMyData();//new definition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多