我目前正在开发一个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入门教程给出的教程。不确定这是否是我想要的实现类型的正确方法。
答案 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,标题,消息)
4c)点击“调用” - 现在应该调用您的服务,弹出一个对话框弹出(消息框),其中包含您已定义的标题和消息
答案 2 :(得分:0)
也许WCF回调可能符合您的要求:
What You Need To Know About One-Way Calls, Callbacks, And Events