使用AspNetCompatibility从WCF服务运行客户端项目

时间:2015-10-26 14:10:29

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

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

我想将这些组合成一个项目。也就是说,在运行服务时,应该出现接口(ASP.NET AngularJS项目)。

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

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

1 个答案:

答案 0 :(得分:0)

有可能。我假设您要在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的形式将它们返回给客户端。