J'ai commencé à apprendre le WCF et je souhaite comprendre ses internes en créant un simple serveur Web en utilisant directement les piles de canaux. J'ai trouvé beaucoup de théorie sur le web mais j'aimerais voir un exemple de code de travail pour recevoir et répondre à une requête http que je peux tester en utilisant n'importe quel navigateur. J'espère quelque chose qui montre la mise en place d'une liaison personnalisée en assemblant des éléments de liaison pour répondre à la demande.Comment créer un serveur Web simple en utilisant WCF sans la classe ServiceHost?
1
A
Répondre
2
obtenu la réponse dans les forums 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)
Je ne sais pas - le ServiceHost est responsable pour la filature et l'initialisation de l'ensemble côté serveur d'exécution WCF - pas sûr si vous ** vraiment ** vouloir reproduire tout ce code ..... quel est le point, vraiment? On dirait de réinventer un système d'exécution assez complexe et très complexe - qu'est-ce que vous voulez en tirer? –
Je ne pense pas que ce que je veux faire est très complexe, j'ai trouvé un échantillon ici - http://msdn.microsoft.com/en-us/library/ms789029(VS.90).aspx - mais pourrait ' Ne le faites pas fonctionner. En aucun cas j'ai l'intention de l'utiliser en production, j'aime juste comprendre les pièces qui font la WCF. –
"Parce que je veux savoir comment ça marche" est une bonne raison pour réinventer la roue. –