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