如何使现有的C#dll可用作Web服务

时间:2015-01-29 12:53:30

标签: c# .net web-services

原则上这看起来很简单,但我想知道是否有人可以带我完成基本步骤?

我有一个应用程序API,在应用程序解决方案中作为C#类库项目实现。因此,人们可以通过直接引用dll来编写自己的传统.Net应用程序。

我现在需要将完全相同的功能作为Web服务提供,因此可以编写应用程序以通过http远程访问相同的API。理想情况下,我只想用适当的Web服务属性标记API类和方法,但我怀疑它还有更多。我还必须让API dll继续作为桌面应用程序的API工作,就像现在一样。

这可行吗?如果是这样,我需要采取哪些步骤?

1 个答案:

答案 0 :(得分:0)

Web服务可以主要由包装器方法组成。以简单的情况为例......

如果程序集中的API方法是

public void DoFoo(string bar)

然后您的Web API方法(您选择的实现,如WebAPI,ASMX Web服务等)将如下所示

public void DoFoo(string bar) {
    // ... initialization or validation
    try {
        refToDll.DoFoo(bar);
    } catch (Exception e) {
        // implementation specific return of error.
    }
}

如果您主要使用静态方法或采用原始类型,那就更容易了。如果您的API已定义类型,则会变得更难。您需要更改类型签名和重新实现方法。没有您的API,就很难提出具体的建议。但是,有几种选择。如果你有

 public class BazClass {
     public string GetScore() {
         return scores.Sum();
     }
 }

您基本上需要确保远程端(Web API)可以从客户端重建上下文。您必须传入一个可序列化的实例或BazClass的其他表示形式,并让远程API在其上工作。否则它就不存在了。您还可以创建一组在服务器上存储状态的方法,并使用"句柄"在客户端或对象引用,但这必须是一个设计决策(只需看看与本机库互操作,处理,并转换为跨网络)。例如:

public string BazGetScore(Transport.BazClass baz) {
     // Depending on the framework and class (all public getters/setters)?
     // your framework may allow for transparent serialization
     BazClass bazReal = bazFactory(baz);
     string score = bazReal.GetScore();
     return score;
 }

您的源API有多少基于接口?这可能会使最终用户更加透明地创建Proxy类。如果你有

public class Baz : IBaz { ... }

然后,您可以创建一个类似于IBaz的Proxy类,但调用远程API而不是本地操作。根据您的框架和工具,这些工具可以为此提供便利。

namespace RemoteAPIProxy {
    public class Baz : IBaz {
        public string GetScore() {
            // initialization of network, API, etc
            Transport.Baz baz = new Transport.Baz.From(this);
            string score = CallRemoteAPI("BazGetScore", baz);
            return score;
        }
    }
}

总之,根据您是否需要支持状态,非公共方法或完整范围,您可能必须创建一些中间类。 "怎么"大多数情况下可以被认为只是另一个包装器,但您需要意识到如何通过线路获取本地状态并进入远程API的上下文。使用接口,序列化助手和轻量级传输对象来帮助使用" glue"。记住,唯一的"我" in" API"用于"接口",所以你可能想确保你有一些。祝你好运!