是否有可能创建一个“可浏览”的自托管WCF服务?
本文关键字:可浏览 服务 WCF 浏览 创建 有可能 一个 是否 | 更新日期: 2023-09-27 18:07:29
是否有可能创建一个"可浏览"的自托管WCF服务,即可以在web浏览器中查看和访问?
我们有一个Windows服务,我需要偶尔调用它来检索一些诊断数据。我的想法是自托管一个服务,然后RDC到服务器,启动IE,并在浏览器中访问该服务(因此我只启用了localhost绑定)。一个可接受的替代方案(我也不知道该怎么做)可能是将该服务开放给互联网访问,但将其限制为具有管理员权限的Windows帐户,然后我可以编写一个简单的程序来调用该服务并获取数据。这样做的缺点是,我们的防火墙是一个噩梦配置,所以我宁愿不打开另一个端口。
下面是目前为止的代码:WCF契约和实现:
/// <summary>
/// Windows Communications Foundation Diagnostics Service contract
/// </summary>
//[Service Contract] // commented out and space added as current code doesn't work with these attributes in place; they're needed if using WebServiceHost (which didn't help)
public interface IDiagnosticsService
{
//[Operation Contract]
List<ConnectedModemDiagnosticsClass> EnumerateConnectedModems();
}
/// <summary>
/// Windows Communications Foundation Diagnostics Service class
/// </summary>
public class WCFDiagnosticsService : IDiagnosticsService
{
public List<ConnectedModemDiagnosticsClass> EnumerateConnectedModems()
{
return TcpServerSingleton.Instance.EnumerateConnectedModems();
}
}
"工厂"功能:
public static ServiceHost HttpSelfHostFactory(int port, string serviceNameForUri, Type serviceType, Logging logObject, string hostName = "localhost", bool publishMetadata = true, bool startListening = true)
{
// Argument checking:
if (string.IsNullOrWhiteSpace(serviceNameForUri))
throw new ArgumentException("serviceNameForUri");
serviceNameForUri = serviceNameForUri.Trim();
if (hostName != null)
hostName = hostName.Trim().ToLower();
switch (hostName)
{
case "localhost":
case "127.0.0.1":
break;
case null:
case "":
throw new ArgumentException("hostName");
default:
throw new NotImplementedException("Non localhost bindings not yet implemented. Need to ensure security.");
}
ServiceHost selfHost = null;
try
{
// Create Uri:
Uri baseAddress = new Uri(string.Format("http://{0}:{1}/{2}", hostName, port, serviceNameForUri));
logObject.WriteLogFile("", "Starting WCF server on " + baseAddress);
// Create the ServiceHost:
selfHost = new ServiceHost(serviceType, baseAddress);
// Enable metadata publishing:
if (publishMetadata)
{
ServiceMetadataBehavior smb = new ServiceMetadataBehavior {HttpGetEnabled = true, MetadataExporter = {PolicyVersion = PolicyVersion.Policy15}};
selfHost.Description.Behaviors.Add(smb);
}
// Start listening:
if (startListening)
selfHost.Open();
}
catch (Exception ex)
{
logObject.WriteLogFile("WCF startup exception " + ex.Message);
if (selfHost != null)
{
try { selfHost.Close(); }
catch { }
selfHost = null;
}
}
return selfHost;
}
}
实例化:
_selfHostDiagnostics = HttpSelfHostFactory(Settings.Default.WCFHttpDiagnosticsPort, "Diagnostics", typeof(WCFDiagnosticsService), FTArmada.Logging);
如果你创建一个基于webHttpBinding
的WCF REST服务——那将是固有的"可浏览"。
查看MSDN开发人员中心的WCF REST获取更多详细信息。
你基本上可以通过实例化一个WebServiceHost
而不是一个更通用的ServiceHost
来把你的WCF服务作为REST服务来托管。
完成后,您可以通过从浏览器发出HTTP请求来"导航"您的服务。进入
http://yourURL/diagnostics/modems
可能会显示所有已安装调制解调器的列表,您可以通过URL"导航"到单个调制解调器,例如:
http://yourURL/diagnostics/modems/4711
如果你的调制解调器有一些唯一的ID -这个URL可能会显示一个状态页或其他东西
为什么不直接使用像这样的嵌入式web服务器来托管一个网站并在windows服务中提供asp.net页面呢