2

这个问题是我之前的一个后续问题,我发现它在我的计算机上不能 100% 工作:WCF 服务未在非开发机器上运行

我正在研究这个例子:

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 时它才开始工作 - 当我在上面观察到时。

有任何想法吗 ?

4

2 回答 2

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 服务来通过网络提供服务。

于 2012-12-06T07:37:18.677 回答
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 自己启动了它。

于 2012-12-06T14:02:46.460 回答