我已经开始学习 WCF,并希望通过直接使用通道堆栈创建一个简单的 Web 服务器来了解其内部结构。我在网上找到了很多理论,但我希望看到一个可以使用任何浏览器测试的接收和响应 httprequest 的工作示例代码。我希望通过组装绑定元素一直响应请求来显示自定义绑定的设置。
问问题
5322 次
1 回答
4
在 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<IReplyChannel> listener =
binding.BuildChannelListener<IReplyChannel>(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<string>();
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("<html><body><h1>Hello</h1></body></html>"));
// 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)
于 2010-07-05T11:46:24.243 回答