如何在用户的计算机上自动配置WCF服务

时间:2013-10-15 14:39:07

标签: c# .net wcf

我有一个控制外部硬件的现有.NET应用程序。我正在研究将PC上已有的一些功能扩展到智能手机应用程序,该应用程序将专门用于本地网络。这不是安装在单个位置的企业系统,而是一个向公众出售的系统。 WCF看起来是一个很好的解决方案,但如果我不得不让用户通过手动设置服务,配置IIS等,这是一个showstopper。我如何以编程方式部署WCF服务,以便在本地网络上可见?

2 个答案:

答案 0 :(得分:1)

WCF可以通过几种不同的方式托管。 Here是一篇很棒的文章,可以帮助你。您可以跳转到“探索托管选项”一节。

答案 1 :(得分:0)

我已经明白了。 Code Chops指出,显然有多种托管方法。根据我的要求,我只需要一个在我正在扩展的程序运行时运行的自托管解决方案。我也使用C#,没有xml配置。这允许我以编程方式确定本地IP地址(未示出)。这一切都在普通的控制台应用程序中运行。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    using System.ServiceModel.Web;


    namespace SelfHost
    {
        class Program
        {
            static void Main(string[] args)
            {     
                string localIP = "192.168.1.5";
                string port = "8001";
                Uri baseAddress = new Uri("http://" + localIP + ":" + port + "/hello");

                using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
                {                       
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                    host.Description.Behaviors.Add(smb);
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new WebHttpBinding(), "");
                    host.Description.Endpoints[0].Behaviors.Add(new WebHttpBehavior { HelpEnabled = true });                
                    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();
                }
            }
        }

        [ServiceContract]
        public interface IHelloWorldService
        {
            [OperationContract]
            [WebGet(UriTemplate = "SayHello/{name}")]
            string SayHello(string name);

            [OperationContract]
            [WebGet(UriTemplate = "SayGoodbye/{name}")]
            string SayGoodbye(string name);
        }

        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
                return string.Format("Hello, {0}", name);
            }

            public string SayGoodbye(string name)
            {
                return string.Format("Goodbye, {0}", name);
            }

        }


    }