3

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

4

1 回答 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 回答