如何在WPF应用程序中使简单WCF服务工作?

时间:2017-03-10 00:17:03

标签: c# .net wpf rest wcf

我一直在关注教程here并尝试使用WCF托管一个简单的REST服务器。基本上,我按照教程中的描述创建了WCF接口和类文件:

[ServiceContract]
public interface IService
{
    [OperationContract]
    [WebInvoke(Method = "GET", UriTemplate = "/GET/{msg}/{msg2}")]
    string GetRequest(string msg, string msg2);

    [OperationContract]
    [WebInvoke(Method = "PUT", UriTemplate = "/PUT/{msg}")]
    void PutRequest(string msg, Stream contents);
}

和具体的课程:

class Service : IService
{
    static string Message = "Hello";

    public string GetRequest(string msg, string msg2)
    {
        return Message + msg + msg2;
    }

    public void PutRequest(string msg, Stream contents)
    {
        Service.Message = msg + msg + msg;

        string input = new StreamReader(contents).ReadToEnd();
        Console.WriteLine("In service, input = {0}", input);
    }
}

这两个WCF服务类在我创建的控制台应用程序中完善。以下是" Main"好像。 当我向控制台应用程序提交GET请求时,我得到200 OK

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
             using (var host = new ServiceHost(typeof(Service)))
             {
                 var ep = host.AddServiceEndpoint(typeof(IService), new   WebHttpBinding(), new Uri("http://1.10.100.126:8899/MyService"));

                 ep.EndpointBehaviors.Add(new WebHttpBehavior());
                 host.Open();
                 Console.WriteLine("Service is running");
                 Console.ReadLine();
                 host.Close();
             }
        }


    }

}

但是,当我想在 WPF应用程序中使用这两个类时,它们将不再起作用。这是WPF应用程序的MainWindow类。 当我向WPF应用程序提交GET请求时,我收到错误502 BAD GATEWAY

namespace WpfApplication1
{

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            using (var host = new ServiceHost(typeof(Service)))
            {
                var ep = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), new Uri("http://1.10.100.126:8899/MyService"));

                ep.EndpointBehaviors.Add(new WebHttpBehavior());
                host.Open();
                Console.WriteLine("Service is running");
                Console.ReadLine();
                host.Close();
            }
        }
    }
 }

如何使这两个WCF类与一个简单的空WPF应用程序项目一起工作? 为什么这2个WCF类使用空的控制台应用程序项目,而不是空的WPF应用程序项目?

2 个答案:

答案 0 :(得分:3)

为您提供有关如何在WPF应用程序中正确托管WCF服务的完整,全面的答案,实际上有点过于宽泛,但这里有一些指示。

您的WPF尝试存在一些主要问题:

  1. 您正在尝试在UI线程上托管服务,这是GUI设计和编程中的一个重要禁忌。如果你按照它的方式使用它,你就会锁定你的用户界面,用户除了强行关闭你的应用程序之外什么也做不了。
  2. 你在窗口的代码中处理它全部--WPF鼓励MVVM模式,它引导你分别关注你的视图(窗口,控件等)如何呈现以及服务是什么用过的/托管/消耗。
  3. 你试图在GUI应用程序中使用Console.ReadLine()来阻止该线程,其中没有Console监听 - 所以Console.ReadLine()只是立即返回(但如果你确实设法阻止该线程,你将回到问题#1)。
  4. 有关如何使用更好的设计原则进行操作的完整教程,请参阅以下blog

    其中的一些亮点:

    1. 创建一些控件(例如,按开始'开始'停止')以启动和停止服务。
    2. 将这些按钮连接到逻辑以启动服务并分别停止服务。
    3. 可以在那里做出明显的改进 - 启动和管理服务的生命周期,使用WPF中的命令模型,使用TPL或BackgroundWorker在不同的线程中运行服务,从而更充分地使用MVVM模式 - 但它是一个开始。

答案 1 :(得分:0)

服务主机一打开就会关闭。

默认情况下,使用OutputType作为Windows应用程序创建WPF应用程序。控制台在运行时不会显示,因此Console.ReadLine()不会等待用户输入并移动到下一行。