【问题标题】:Referencing a C# web service project directly in C# solution在 C# 解决方案中直接引用 C# Web 服务项目
【发布时间】:2015-05-12 03:28:21
【问题描述】:

我正在尝试提高 C# 作业的速度,我们称之为“WidgetProcessor”。在一次运行中,WidgetProcessor 将处理大约 5,000 个小部件,大约需要 12 小时才能完成(大约 8 秒/小部件)。

WidgetProcessor 引用 3 个不同的 Web 服务,并为每个处理的小部件多次调用它们。可以对“WidgetProcessor”程序进行各种性能/设计改进,但我想测试网络上的多个 Web 服务调用是否会导致作业运行缓慢。

我拥有三个 Web 服务中每一个的源代码(并且可以访问这些 Web 服务使用的所有资源),并且 我想知道是否有一种方法可以轻松使用 Web 服务接口在 WidgetProcessor 中通过引用 Web 服务项目本身(而不是通过网络调用 Web 服务)。 Web 服务是用 C# 实现的。

我会直接引用服务实现类,但我遇到的主要问题是 Web 服务总共有大约 100 个数据协定,而且面向公众的名称与实现类不同。

[DataContract(Name = "WidgetInfo")]
public class WidgetDataContract
{
      // DataMembers
}

因此,直接引用实现意味着我将在 WidgetProcessor 中进行许多代码更改。相反,我想使用服务接口,这样代码更改可以保持在最低限度。

基本上,我希望 WidgetProcessor 解决方案中的服务看起来和行为都像 Web 服务,但不通过网络执行其操作。

这可能吗?

【问题讨论】:

    标签: c# web-services wcf


    【解决方案1】:

    您可以添加适配器类,这些适配器类使用数据合同中指定的名称对实现进行子类化:

    public class WidgetInfo : WidgetDataContract { }
    

    如果您发现服务调用的开销过于昂贵,您可能会看到使用不同的绑定或序列化格式的好处。如果调整得当,WCF 可以接近进程内速度。


    编辑:如果您打算不修改任何代码,您确实有几个选择,但我认为它们是寻找问题的解决方案:

    • Mono.CecilRoslyn 在构建前或构建后的类之间自动映射
    • 仅对于类型,您可以使用TypeForwardedToAttribute,但属性访问是有问题的。这可能取决于将svcutil 生成的类放在另一个程序集中。
    • 使用Castle 构建动态代理和基于属性的映射访问

    【讨论】:

    • 此解决方案有效,但需要大量包装类。数据契约中的一些数据成员也被重命名,因此数据成员也需要包装。
    • @SuperSimple,这些是选项。我又添加了几个,但您希望从服务中获得什么性能?使用 WCF 可以轻松实现超过 10k 次调用/秒。
    猜你喜欢
    • 2013-08-09
    • 1970-01-01
    • 2021-12-18
    • 2013-10-16
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    相关资源
    最近更新 更多