如何在给定方案中编程我的WCF服务?

时间:2011-11-13 14:50:16

标签: wcf

我目前正在开发一个C#Windows窗体应用程序,我打算让它与服务器进行交互。服务器将从我开发的移动应用程序接收发布,每当收到发布时,我的Windows窗体应用程序都会收到通知并给我通知。

E.g。我的移动应用程序将消息发送到我的服务器。一旦我的服务器收到消息,我的Windows窗体应用程序应显示一条新通知,显示收到的消息内容。

我现在开始开发WCF服务并且已经到达PostingService方法,我不确定我如何能够按照上述方式继续对服务进行编程。

public class PostingService : IPostingService
{
    public void NotifyAboutPosting(Posting post)
    {
        // do something with post here
    }
}

在我对服务进行编程后,如何测试服务,我不知道?上传假帖子以查看服务是否有效,这意味着虚拟测试。谢谢!

修改

对于我的main方法,代码如下,

Uri baseAddress = new Uri("http://localhost/");

        ServiceHost selfHost = new ServiceHost(typeof(IPostingService), baseAddress);

        try
        {

            selfHost.AddServiceEndpoint(typeof(IPostingService),new WSHttpBinding(),     "Posting");

            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            selfHost.Description.Behaviors.Add(smb);

            selfHost.Open();
            Console.WriteLine("The service is ready.");
            Console.WriteLine("Press <ENTER> to terminate service.");
            Console.WriteLine();
            Console.ReadLine();

            selfHost.Close();
        }
        catch (CommunicationException ce)
        {
            Console.WriteLine("An exception occurred: {0}", ce.Message);
            selfHost.Abort();
        }

基本上我只是按照MSDN WCF入门教程给出的教程。不确定这是否是我想要的实现类型的正确方法。

3 个答案:

答案 0 :(得分:2)

那么,你的WCF服务可以做你想做的任何事情 - 所以你真的希望它做什么?

您的发布服务器从移动设备获取新消息,然后在Winforms应用程序中调用此WCF服务类。 你想在这里和现在发生什么? ??

要记住一件事:接收消息的WCF服务类和Winforms应用程序可能在不同的线程上运行;如果是这种情况,你不能只是更新,例如Winforms UI上的UI元素来自服务代码(您需要使用一些同步方法)。但这取决于您在Winforms应用中创建和打开ServiceHost的确切方式。

更新:如果您将代码设置为在主申请表单中创建并初始化ServiceHost(有关如何执行此操作的示例,请参阅Service Synchronization Context on CodeIdol),然后你可能只是这样做:

public class PostingService : IPostingService
{
    public void NotifyAboutPosting(Posting post)
    {
       MessageBox.Show(post.Title, post.Message, 
                       MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

假设您的Posting类同时拥有.Title.Message字符串属性...

答案 1 :(得分:1)

1) PostingService 程序集(类库项目)

界面: IPostingService.cs

using System;
using System.ServiceModel;

namespace PostingService
{
    [ServiceContract]
    public interface IPostingService
    {
        [OperationContract]
        void NotifyAboutPosting(Posting posting);
    }
}

实施: PostingService.cs

using System;
using System.Windows.Forms;

namespace PostingService
{
    public class PostingService : IPostingService
    {
        public void NotifyAboutPosting(Posting posting)
        {
            MessageBox.Show(posting.Message, posting.Title, MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

DataContract: Posting.cs

using System;
using System.Runtime.Serialization;

namespace PostingService
{
    [DataContract]
    public class Posting
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string Title { get; set; }

        [DataMember]
        public string Message { get; set; }
    }
}

2)您的 Winforms应用(Winforms应用项目)

必须引用服务程序集(因为它需要服务契约和数据契约类)

您应用的主要表单: Form1.cs

using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Windows.Forms;

using PostingService;   // your class library from above

namespace WinformsApp
{
    public partial class Form1 : Form
    {
        private ServiceHost _host = null;

        public Form1()
        {
            InitializeComponent();

            // IMPORTANT: here you need the **SERVICE IMPLEMENTATION CLASS** in the typeof() (*NOT* the interface!)
            _host = new ServiceHost(typeof(PostingService), new Uri("http://localhost:8888/PostingService"));

            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            _host.Description.Behaviors.Add(smb);

            _host.Open();

            label2.Text = "Service up and running (http://localhost:8888/PostingService)";
        }

        protected override void OnFormClosed(FormClosedEventArgs e)
        {
            _host.Close();

            base.OnFormClosed(e);
        }
    }
}

3)运行Winforms应用程序 - 现在该服务已启动并正在运行并准备好接收通知。

4)启动WCF Test Client(这就是您的“发布服务器”稍后会做的事情)

4a)文件&gt;添加服务 - 输入http://localhost:8888/PostingService - 应找到您的服务

4b)如果找到:在“发布”类的属性中输入一些值(ID,标题,消息)

enter image description here

4c)点击“调用” - 现在应该调用您的服务,弹出一个对话框弹出(消息框),其中包含您已定义的标题和消息

答案 2 :(得分:0)

也许WCF回调可能符合您的要求:

What You Need To Know About One-Way Calls, Callbacks, And Events