连接到ServiceContract?

时间:2011-03-07 17:36:40

标签: c# wcf

继续学习WCF,我正在尝试编写一个小程序,只需点击一下按钮就可以从texbox1中获取工作,将其传递给ServiceContract并恢复其长度。

这是我有多远。

Form1.cs中:

...
wcfLib.Service myService = new wcfLib.Service();

private void button1_Click(object sender, EventArgs e)
{
    textBox2.Text = Convert.ToString( myService.go(textBox1.Text) );
}

...

和wcf文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace wcfLib
{

    [ServiceContract]
    public interface IfaceService
    {
        [OperationContract]
        int wordLen(string word);
    }



    public class StockService : IfaceService
    {
        public int wordLen(string word)
        {
            return word.Length;
        }
    }





    public class Service
    {
        public int go( string wordin )
        {

            ServiceHost serviceHost = new ServiceHost(typeof(StockService), new Uri("http://localhost:8000/wcfLib"));
            serviceHost.AddServiceEndpoint(typeof(IfaceService), new BasicHttpBinding(), "");

            serviceHost.Open();

            int ret = **///// HOW SHOULD I PASS wordin TO StockService to get word.Length in return?**

            serviceHost.Close();

            return ret;
        }
    }


}

我现在无法弄清楚的是,我如何将上面的wordin变量传递给ServiceContract?

2 个答案:

答案 0 :(得分:1)

您需要在表单中创建客户端并直接调用wordLen()...只有从IfaceService继承的类才能被称为WCF服务。所以:

//  You'll have to create references to your WCF service in the project itself...
//  Right-click your form project and pick 'Add Service Reference', picking 
//  'Discover', which should pick up the service from the service project... else
//  enter http://localhost:8000/wcfLib and hit 'Go'.
//  You'll have to enter a namespace, e.g. 'MyWcfService'... that namespace is
//  used to refer to the generated client, as follows:
MyWcfService.wcfLibClient client = new MyWcfService.wcfLibClient();

private void button1_Click(object sender, EventArgs e) {
    // You really shouldn't have the client as a member-level variable...
    textBox2.Text = Convert.ToString(client.wordLen(textBox1.Text));
}

如果您的Service类要承载WCF服务,则需要将其作为自己的可执行文件并运行...将go()中的代码放在Main()

或者在IIS中托管您的WCF服务......更容易!


修改

IIS = Internet信息服务...基本上通过网络托管WCF服务。

要在IIS中托管,请创建一个新项目“WCF服务应用程序”。您将获得web.config和默认接口以及.svc文件。重命名这些,或将新项目WCF服务添加到项目中。如果你走这条路,你将不得不阅读部署到IIS的一些内容,但是为了在Visual Studio中进行调试,这很有效。

要拆分成两个应用程序,只需将表单设为自己的项目......通过应用程序的配置文件设置服务引用;你只需将它指向机器或网站的地址,例如http://myintranet.mycompany.com:8000/wcflibhttp://myserver:8000/wcflib

感谢投票!

答案 1 :(得分:0)

你肯定已经把事情做好了。您不希望在Go方法中创建ServiceHost,或者至少,您永远不会在客户端调用的任何方法中创建它,因为如果尚未创建服务,客户端如何调用它? / p>

启动WCF中的服务,然后您可以从远程客户端调用其方法。 EG,这是您服务的Main():

ServiceHost serviceHost = new ServiceHost(typeof(StockService), new Uri("http://localhost:8000/wcfLib"));
serviceHost.AddServiceEndpoint(typeof(IfaceService), new BasicHttpBinding(), "");
serviceHost.Open();
Console.WriteLine("Press return to terminate the service");
Console.ReadLine();
serviceHost.Close();

然后,对于您的客户端,您将在Visual Studio中使用“添加服务引用”(右键单击解决方案资源管理器中的项目以查找此菜单选项)并输入服务的地址。 Visual Studio将为您的服务创建代理,这是您在客户端上实例化和使用的内容。 EG:

MyServiceClient client = new MyServiceClient();

textBox2.Text = Convert.ToString( client.wordLen(textBox1.Text) );