如何在没有ServiceHost类的情况下使用WCF创建简单的Web服务器?

我已经开始学习WCF并希望通过直接使用通道堆栈创建一个简单的Web服务器来了解它的内部结构。 我在网上找到了很多理论,但是我希望看到一个接收和响应httprequest的工作示例代码,我可以使用任何浏览器进行测试。 我希望通过将绑定元素组装到响应请求的方式来显示自定义绑定的设置。

在MSDN论坛中得到了答案:

static void RunService() { //Step1: Create a custom binding with just TCP. BindingElement[] bindingElements = new BindingElement[2]; bindingElements[0] = new WebMessageEncodingBindingElement(); bindingElements[1] = new HttpTransportBindingElement(); CustomBinding binding = new CustomBinding(bindingElements); //Step2: Use the binding to build the channel listener. IChannelListener listener = binding.BuildChannelListener(new Uri("http://localhost:8080/channelapp"), new BindingParameterCollection()); //Step3: Listening for messages. listener.Open(); Console.WriteLine( "Listening for incoming channel connections"); //Wait for and accept incoming connections. IReplyChannel channel = listener.AcceptChannel(); Console.WriteLine("Channel accepted. Listening for messages"); //Open the accepted channel. channel.Open(); //Wait for and receive a message from the channel. RequestContext request= channel.ReceiveRequest(); //Step4: Reading the request message. Message message = request.RequestMessage; Console.WriteLine("Message received"); Console.WriteLine("To: {0}", message.Headers.To); // TO contains URL from the browser including query string if (!message.IsEmpty) // HTTP GET does not contain body { string data = message.GetBody(); Console.WriteLine("Message content: {0}", data); } //Send a reply - You can control reply content based on message.Header.To or by message content Message replymessage = Message.CreateMessage(binding.MessageVersion, "http://contoso.com/someotheraction", XElement.Parse("

Hello

")); // Set reply content type HttpResponseMessageProperty property = new HttpResponseMessageProperty(); property.Headers[System.Net.HttpResponseHeader.ContentType] = "text/html; charset=utf-8"; replymessage.Properties[HttpResponseMessageProperty.Name] = property; request.Reply(replymessage); //Step5: Closing objects. //Do not forget to close the message. message.Close(); //Do not forget to close RequestContext. request.Close(); //Do not forget to close channels. channel.Close(); //Do not forget to close listeners. listener.Close(); }

http://social.msdn.microsoft.com/Forums/en/wcf/thread/09b620e0-ea81-4a6c-8a10-02a032ccd821