【问题标题】:Using AspNetCompatibility to run a client project from a WCF service使用 AspNetCompatibility 从 WCF 服务运行客户端项目
【发布时间】:2015-10-26 14:10:29
【问题描述】:

我有两个项目 - 一个提供数据库操作的 WCF 服务,以及一个运行 AngularJS 的 ASP.NET 项目,它充当服务的客户端。

我想将这些组合成一个项目。即在运行服务时,界面(ASP.NET AngularJS 项目)应该会出现。

我看到一些消息来源说 AspNetCompatibilityMode 可以用来做这样的事情,但我还没有看到如何实际指定客户端。

这是正确的做法吗?有没有更简单的方法?提前致谢!

【问题讨论】:

标签: c# asp.net angularjs web-services wcf


【解决方案1】:

这是可能的。我假设您想在您的 ASP.NET Web 表单/mvc(无论)类型的项目中公开现有的 WCF 服务。 步骤:

1) 确保您的 ASP.NET 项目引用 WCF 服务实现所在的程序集

2) 将您的 ASP.NET 项目中的 global.asax 更改为:

using System.ServiceModel.Activation; // from assembly System.ServiceModel.Web
protected void Application_Start(Object sender, EventArgs e)
{
  RegisterRoutes(RouteTable.Routes);
}
void RegisterRoutes(RouteCollection routes)
{
  routes.Add(new ServiceRoute("Services/Angular", new WebServiceHostFactory(), typeof(WCFNamespace.AngularService)));
}

这会注册以 /Service/Angular 前缀开头的调用,由您的 WCF 服务处理。

3) 您的 WCF 服务应如下所示

[ServiceContract]
public interface IAngularService
{
  [OperationContract]
  [WebGet(UriTemplate = "/Hello", RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json)]
  [Description("Returns hello world json object")]
  HelloWorld GetHello();
}

[DataContract]
public class HelloWorld
{
  [DataMember]
  public string Message { get; set; }
}

注意这些方法——它们应该用[WebGet][WebInvoke] 方法装饰,因为对于Angular,你想构建RESTfull wcf 服务。序列化/反序列化格式也设置为 json。

[AspNetCompatibilityRequirements(RequirementsMode = 
  AspNetCompatibilityRequirementsMode.Allowed)]
public class AngularService : IAngularService
{
  public HelloWorld GetHello()
  {
    return new HelloWorld { Message = "Hello from WCF. Time is: " +
      DateTime.Now.ToString() };
  }
}

现在,如果您在浏览器中输入 /Services/Angular/Hello,您应该能够获取 json 对象。

最后,正如您所注意到的,WCF 合同实现(在本例中为类 AngularService)必须使用属性[AspNetCompatibilityRequirements] 进行标记,以便 IIS 可以将其托管在 ASP.NET Web 表单/MVC 项目下。

免责声明:这是非常幼稚的实现,在现实世界中,您可能希望捕获和记录服务中发生的异常,并将它们以 json 的形式返回给客户端。

【讨论】:

  • 我收到此错误:“找不到类型或命名空间名称 'WebServiceHostFactory'(您是否缺少 using 指令或程序集引用?)”我将 System.ServiceModel.Activation 添加到项目引用并将“使用 System.ServiceModel.Activation”添加到 Global.asax。我还需要在 Web.config 中添加一些内容吗?
  • 显然我需要使用ServiceHostFactory。我添加了其他东西;我应该能够访问的完整 URL 是什么?我试过localhost:port/AngularService.svc/Services/Angular/Hello,但收到错误“'/'应用程序中的服务器错误”
  • @Evan - 我的意思是 WebServiceHostFactory :) 我已经编辑了答案以突出显示程序集和命名空间。
猜你喜欢
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
相关资源
最近更新 更多