原则上这看起来很简单,但我想知道是否有人可以带我完成基本步骤?
我有一个应用程序API,在应用程序解决方案中作为C#类库项目实现。因此,人们可以通过直接引用dll来编写自己的传统.Net应用程序。
我现在需要将完全相同的功能作为Web服务提供,因此可以编写应用程序以通过http远程访问相同的API。理想情况下,我只想用适当的Web服务属性标记API类和方法,但我怀疑它还有更多。我还必须让API dll继续作为桌面应用程序的API工作,就像现在一样。
这可行吗?如果是这样,我需要采取哪些步骤?
答案 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"用于"接口",所以你可能想确保你有一些。祝你好运!