WCF自助主机服务 - C#中的端点

时间:2010-05-11 01:34:34

标签: wcf console-application endpoints self-hosting

我在创建自托管服务时的首次尝试。尝试创建一些接受查询字符串并返回一些文本但有一些问题的东西:

  • 如果在配置文件中找不到端点,则所有文档都会自动为每个基址自动创建端点。这对我来说似乎不是这样,我得到“服务没有应用程序端点......”的例外情况。手动指定基本端点如下所示似乎解决了这个问题:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    namespace TestService
    {
        [ServiceContract]
        public interface IHelloWorldService
        {
           [OperationContract]
           string SayHello(string name);
        }
    
        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
               return string.Format("Hello, {0}", name);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                string baseaddr = "http://localhost:8080/HelloWorldService/";
                Uri baseAddress = new Uri(baseaddr);
    
                // Create the ServiceHost.
                using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
                {
                    // Enable metadata publishing.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                    host.Description.Behaviors.Add(smb);
    
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr);
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello");
    
                    //for some reason a default endpoint does not get created here
                    host.Open();
    
                    Console.WriteLine("The service is ready at {0}", baseAddress);
                    Console.WriteLine("Press <Enter> to stop the service.");
                    Console.ReadLine();
    
                    // Close the ServiceHost.
                    host.Close();
                }
             }
         }
    }
    
  • 如果需要,我如何设置它以在SayHello(字符串名称)中返回name的值:localhost:8080 / HelloWorldService / SayHello?name = kyle

我在跑步前试图走路,但这似乎只是爬行......

3 个答案:

答案 0 :(得分:10)

有关未添加默认端点的问题:

  • 首先,这是一个WCF 4功能 - 它只适用于.NET 4
  • 接下来,如果您没有在配置中定义明确的端点,并且不在代码中自己添加端点,则默认端点仅添加到您的服务主机!通过在代码中添加这两个端点,您需要负责并且WCF 4运行时不会乱用您的配置

有关What's new in WCF 4 for developers的更多信息,请查看此MSDN库文章。除其他外,它显示了如何使用默认端点 - 您基本上为您的服务定义了一个基地址并打开了ServiceHost - 这就是全部!

string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have one endpoint for each contract and binding
}

如果您愿意,还可以在代码中显式添加默认端点。因此,如果您需要添加自己的端点,但是想要添加系统默认端点,则可以使用:

// define and add your own endpoints here

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   // add all the system default endpoints to your host
   host.AddDefaultEndpoints();

   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have your own endpoints, plus 
   // one endpoint for each contract and binding
}

我也fonud this blog post here非常有启发性 - 克里斯托弗的博客充满了非常有用且非常有用的WCF帖子 - 强烈推荐。

答案 1 :(得分:3)

至于书籍 - 这是我的建议:Michele Leroux Bustamante撰写的我总是建议在WCF中快速启动和运行的书是Learning WCF。她涵盖了所有必要的主题,并且以一种非常容易理解和平易近人的方式。这将教会您编写高质量,有用的WCF服务所需的一切 - 基础知识,中间主题,安全性,事务控制等等。

Learning WCF http://ecx.images-amazon.com/images/I/41wYa%2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

Juval Lowy将Programming WCF Services涵盖更高级的主题以及对WCF的更深入了解。他真正深入研究了所有技术细节和主题,并为WCF编程提供了“圣经”。

Programming WCF Services http://ecx.images-amazon.com/images/I/41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

答案 2 :(得分:0)

如果IIS托管您的Web服务,那么您将获得友好的“您已创建Web服务”页面,假设没有其他错误。你可能想尝试一些快速的WCF教程,就像在Bustamente的学习WCF书中找到的那样,它们可以快速解释并解释很多。

编辑:Here's an MSDN page显示了一种从您请求的服务调用中获取查询字符串参数的方法,很好的例子。它显示了[WebGet]属性的使用。如果您不想使用它,可以尝试使用OperationContext来获取传入请求的内部。