我一直在关注教程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应用程序项目?
答案 0 :(得分:3)
为您提供有关如何在WPF应用程序中正确托管WCF服务的完整,全面的答案,实际上有点过于宽泛,但这里有一些指示。
您的WPF尝试存在一些主要问题:
Console.ReadLine()
来阻止该线程,其中没有Console
监听 - 所以Console.ReadLine()
只是立即返回(但如果你确实设法阻止该线程,你将回到问题#1)。有关如何使用更好的设计原则进行操作的完整教程,请参阅以下blog
其中的一些亮点:
可以在那里做出明显的改进 - 启动和管理服务的生命周期,使用WPF中的命令模型,使用TPL或BackgroundWorker在不同的线程中运行服务,从而更充分地使用MVVM模式 - 但它是一个开始。
答案 1 :(得分:0)
服务主机一打开就会关闭。
默认情况下,使用OutputType作为Windows应用程序创建WPF应用程序。控制台在运行时不会显示,因此Console.ReadLine()不会等待用户输入并移动到下一行。