MSDN WCF服务示例无法正常工作

时间:2012-12-06 07:07:17

标签: c# wcf windows-services nettcpbinding

此问题是我之前发现的问题,我发现它在我的计算机上无法正常工作:WCF service not running on non-dev machine

我正在研究这个例子:

http://msdn.microsoft.com/en-us/library/ff649818.aspx

事实证明,InstallUtil步骤并没有真正起作用。我发现如果VS2010项目打开了,你去添加一个服务引用,就像本教程的第8步那样,VS2010实际上启动了服务主机,因此创建了一个引用。

到目前为止我的调试方式如下:

  • 按照InstallUtil安装服务,关闭VS2010解决方案;然后打开一个完全不同的解决方案(TESTWCF)尝试并添加一个服务引用,它失败 - 无法在指定的地址找到

  • 再次打开WCFServiceLibrary1项目作为VS2010的单独实例。尝试并向TESTWCF添加服务引用,但它失败。

  • 在WCFServiceLibrary1中,尝试第8步 - 添加服务引用。这会导致服务主机启动并找到服务。

  • 在服务主机仍在运行的情况下,在TESTWCF中,我尝试添加服务并运行。

  • 关闭服务主机并尝试在TESTWCF中添加引用,它不再有效。

这一切似乎完全独立于正在运行或未按InstallUtil安装的服务运行。

我还通过从头开始创建新的虚拟服务器并逐个加载东西来验证这一点。只有安装了VS2010才能开始工作 - 当我在上面观察时。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

  

WCF服务可以在应用程序(例如控制台或Windows窗体应用程序)中自托管

我认为你已经过度复杂了,你甚至不必用InstallUtil安装它。 InstallUtil安装它作为Windows服务运行,你可以创建将作为WCF服务的控制台应用程序。

您必须导入:

System.ServiceModel
System.ServiceModel.Web
System.Web.Services

如果您想将其用作带有get和post的Web服务,我认为需要使用web。

然后您需要为客户端和服务器指定合同。

[ServiceContract(Name = "SomeService", Namespace = "http://some.domain.com/some/someservice",SessionMode=SessionMode.Required)]
    public interface ISomeService
    {
        [OperationContract]
        string Execute(string expression);
    }

你有合同,现在你必须在服务中实施它。没有什么特别之处就是使用这个界面。

app.config非常重要,您必须为客户端和服务指定它。在配置中,您拥有指向服务的所有内容。

在客户端,你必须添加服务作为参考,它应该在第8点找到它,但只有你有配置好!

在客户端中,只需使用以下代码执行某些操作:

 using (ChannelFactory<ISomeService> channel = new ChannelFactory<ISomeService>("SomeService"))
            {
                ISomeService svc = channel.CreateChannel();
                svc.Execute("my expression to evaluate by the service");
             }

尝试在没有InstallUtil的情况下以最简单的方式实现,并且不必通过Windows服务来通过网络提供服务。

答案 1 :(得分:1)

成功!经过4天的努力,MSDN教程有一个致命的缺陷。

在本教程的第一步中,您将创建一个wcf服务库,默认情况下它将服务命名为Service1。在本教程的步骤2.6中,系统会要求您指定基址:

net.tcp://localhost:8523/Service1 

步骤3要求您创建一个新的Windows服务,默认情况下,这也称为Service1。

在步骤5.2中,系统会要求您引用System.ServiceModel和WcfServiceLibrary1。

在步骤5.6中,替换Onstart方法以启动服务,步骤8显示最终代码为:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.ServiceModel;
using WcfServiceLibrary1;

namespace WindowsService1
{
public partial class Service1: ServiceBase
{
    internal static ServiceHost myServiceHost = null; 

    public WCFServiceHost1()
    {
        InitializeComponent();
    }
    protected override void OnStart(string[] args)
    {
        if (myServiceHost != null)
        {
            myServiceHost.Close();
        }
        myServiceHost = new ServiceHost(typeof(Service1));
        myServiceHost.Open();
    }
    protected override void OnStop()
    {
        if (myServiceHost != null)
        {
            myServiceHost.Close();
            myServiceHost = null;
        }
    }
}
}

错误的关键代码是:

        myServiceHost = new ServiceHost(typeof(Service1));

在VS2008或2005中它可能表现不同,或者它可能是VS2010中的配置,但是,我的VS2010将Service1解释为包含类的那个,即:

WindowsService1.Service1

实际上它应该是:

WcfServiceLibrary1.Service1

我注意到4天前,但我觉得我对WCF知之甚少,而且我错了 - 尤其是当它看起来有效时因为VS2010启动了它。