2012-10-14 54 views
2

我有一个使用DuplexChannelFactory和命名管道的简单WCF服务器。我可以从控制台应用程序调用它,并且可以从WPF应用程序调用它。但是,是否可以从ASP.NET调用相同的WCF服务器,并且仍然可以从控制台\ WPF应用程序调用它?从ASP.NET调用WCF服务器

我使用以下端点:

[ServiceContract(SessionMode = SessionMode.Required, 
    CallbackContract = typeof(IMyWCFClient))] 
public interface IMyWCFServer 
{ 
    [OperationContract] 
    bool Subscribe(); 
    [OperationContract] 
    bool UnSubscribe(); 
} 

我可以更新此可以被调用从ASP.NET?

+3

您是否尝试在ASP.NET应用程序中调用**当前服务**?我认为你只需要在客户端(在这种情况下是Web应用)配置服务,就像在控制台和WPF应用上配置服务一样。另一方面,如果您想通过HTTP公开相同的服务,那么您将需要在主机Web应用程序中配置新的端点。 – Jupaol

回答

2

基本上创建Ajax启用端点的WCF服务有打电话需要从你的JavaScript方法执行以下能力:

1)添加AspNetCompatibilityRequirements到WCF服务的定义,所以它看起来像下面的代码:

namespace Test 

[ServiceContract(Namespace = "Test.Services")] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class TestService : IMyWCFServer 
{ 
    // To use HTTP GET, add [WebGet] attribute. (Default ResponseFormat is WebMessageFormat.Json) 
    // To create an operation that returns XML, 
    //  add [WebGet(ResponseFormat=WebMessageFormat.Xml)], 
    //  and include the following line in the operation body: 
    //   WebOperationContext.Current.OutgoingResponse.ContentType = "text/xml"; 

    public bool UnSubscribe() 
    { 
     return true; 
    } 

    public bool Subscribe() 
    { 
     return false; 
    } 
} 

注:命名空间也是必不可少的,因为它会通过ScriptManager的用来生成客户端代理服务后,将被注册它。

2)然后添加[YourServiceName] .SVC与以下定义Asp.Net Web应用程序项目文件:

<%@ ServiceHost 
Language="C#" Debug="true" 
Service="Test.TestService " 
Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %> 

该文件足以注册WCF服务作为阿贾克斯之一。

3)然后通过添加以下到您想要使用的服务页面(或母版页)注册脚本管理这个服务:

<asp:ScriptManagerProxy runat="server" ID="ScriptManagerProxy"> 
    <Services> 
     <asp:ServiceReference Path="~/[RelativePathToSVCFile].svc" /> 
    </Services> 
</asp:ScriptManagerProxy> 

然后,你就可以从JavaScript调用服务就像下面这个例子:

var wasSubscribed = Test.Services.TestService.Subscribe(); 

例如一些更多的信息,可以在本文中找到:http://dotnetslackers.com/articles/ajax/JSON-EnabledWCFServicesInASPNET35.aspx

编辑: 有几种方法可以通过编程方式向脚本管理器添加脚本引用。第一个是ScriptManager控件本身也可用于将wcf服务注册为脚本服务。但要获得当前的脚本管理器实例,您需要参考当前的页面实例。所以,下面的代码显示了如何从代码来完成后面的类中的任何页面或服务器控件的:

protected void Page_Load(object sender, EventArgs e) 
    { 
     ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 
     scriptManager.Services.Add(new ServiceReference { Path = "[RelativePathToSVCFile].svc" }); 
    } 

这是例子如何从代码编程方式添加的ScriptManagerProxy背后类中的任何页面或服务器控件。此方法要求您有权访问控件页面或服务器控件的集合:

/// <summary> 
    /// Called by the ASP.NET page framework to notify server controls that use composition-based implementation to create any child controls they contain in preparation for posting back or rendering. 
    /// </summary> 
    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 

     ScriptManagerProxy scriptManagerProxy = new ScriptManagerProxy { ID = "ScriptManagerProxy" }; 
     this.Controls.Add(scriptManagerProxy); 

     scriptManagerProxy.Services.Add(new ServiceReference { Path = "[RelativePathToSVCFile].svc" }); 
    } 
+0

我也忘记提到wcf服务的实现甚至可以位于单独的Assembly中(在这种情况下,您只需要添加对它的引用)。因此,您将能够使用现有的绑定到您的wcf服务+将会使用[YourServiceName] .svc文件指定的Ajax绑定。 –

+0

你知道如何添加以编程方式添加ScriptManagerProxy,因为我不需要一个控件来容纳ScriptManagerProxy? –

+0

我更新了我的帖子。请参阅编辑部分。 –

5

是的,你可以通过控制台,WPF和ASP.NET调用WCF服务。但是您首先需要创建适当的endpoint

How to: Create a Service Endpoint in Configuration

+0

我已使用我的端点更新了问题 - 如何更新以支持ASP.NET? –

+0

对不起,亲爱的你只给了契约而不是终点。通常端点在配置文件中。 – jams