我在C#类库中实现了WCF REST API。最终,我希望该服务能够在我自己的进程中托管,或者作为Windows服务托管,具体取决于用户的选择。所以它需要支持inproc和HTTP绑定。
以下工作作为管理员,但不是普通用户(说它没有权限打开HTTP端口)。
我的下一步是什么?我应该在进程中使用不同的协议吗?只要我保留了在HTTP绑定上跨机器的能力,我很满意。
WebServiceHost host = new WebServiceHost(typeof(SapphireServiceLib.SapphireService), new Uri("http://localhost:8080/") );
try
{
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(SapphireServiceLib.ISapphireService), new WebHttpBinding(), "");
host.Open();
}
catch (Exception ex)
{
MessageBox.Show("Unable to start Sapphire Service Host: " + ex.Message);
return;
}
// Next, connect to the endpoint for our own use
try
{
// Set the max msg large, otherwise max size would be 64K and we couldn't fetch all the logs.
// REVIEW I suppose this might expose it to a Denial of Service attack if public
var binding = new WebHttpBinding() { MaxReceivedMessageSize = Int32.MaxValue };
ChannelFactory<ISapphireService> cf = new ChannelFactory<ISapphireService>(binding, "http://localhost:8080");
cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
SapphireService = cf.CreateChannel();
}
catch (Exception ex)
{
MessageBox.Show("Unable to connect to service endpoint: " + ex.Message);
return;
}
如果要保留http绑定,则必须使用netsh http add urlacl url=http://+80/YourService
命令允许没有管理员权限的进程使用它。
另一种选择是切换到netTcpBinding。