在不指定 uri 的情况下使用 WCF
本文关键字:情况下 WCF uri | 更新日期: 2023-09-27 17:56:13
如何在不指定 uri/url/baseaddress 的情况下使用 WCF?有没有办法让它自动获得这些东西?
我的意思是,我希望让它像 asp.net 站点和 Web 服务一样工作,我们不提及 uri 和其他东西,只要我们在 IIS 中正确配置它,它就会自行处理它。我需要在 WCF 上提供类似的解决方案。
请帮忙...
谢谢。
编辑:这是我的服务器端代码。我在这里使用自定义服务主机工厂...
protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
BasicHttpBinding basichttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basichttpbinding.CloseTimeout=TimeSpan.MaxValue;
basichttpbinding.OpenTimeout=TimeSpan.MaxValue;
basichttpbinding.ReceiveTimeout=TimeSpan.MaxValue;
basichttpbinding.SendTimeout=TimeSpan.MaxValue;
// basichttpbinding.TransferMode = TransferMode.Buffered;
ServiceEndpoint servicepoint=new ServiceEndpoint(ContractDescription.GetContract(serviceType));
servicepoint.Binding=basichttpbinding;
ServiceHost servicehost = new ServiceHost(serviceType, baseAddresses);
((ServiceDebugBehavior)servicehost.Description.Behaviors[typeof(ServiceDebugBehavior)]).IncludeExceptionDetailInFaults=true;
servicehost.OpenTimeout = TimeSpan.MaxValue;
servicehost.CloseTimeout = TimeSpan.MaxValue;
servicepoint.Binding.SendTimeout = TimeSpan.MaxValue;
servicepoint.Binding.ReceiveTimeout = TimeSpan.MaxValue;
basichttpbinding.MaxBufferPoolSize = 999999999;
// basichttpbinding.MaxConnections = 999999999;
//basichttpbinding.MaxConnections = 999999999;
basichttpbinding.MaxReceivedMessageSize = 999999999;
XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas();
quotas.MaxArrayLength = 999999999;
quotas.MaxBytesPerRead = 999999999;
quotas.MaxDepth = 999999999;
quotas.MaxNameTableCharCount = 999999999;
quotas.MaxStringContentLength = 999999999;
basichttpbinding.ReaderQuotas = quotas;
//foreach (Uri uri in baseAddresses)
//{
servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "http://localhost:52855/WCFService1/Service.svc");
// }
return servicehost;
}
(假设你的目标是IIS...)
根据部署 Internet 信息服务承载的 WCF 服务文档:
。服务业 托管在 IIS 中没有能力 控制其基址;这 IIS 承载的服务的基址 是其 .svc 文件的地址。
您的自定义服务主机逻辑是否有可能停止此行为工作?
更新:根据函数文档,您只需将相对地址传递给 AddServiceEndpoint 调用即可。尝试空字符串或"/"。
查看 WCF 发现 它允许您动态查找终结点。
我认为你需要对你的代码做的只是:
servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "");
实现你想要的。正如@Schneider指出的,IIS 控制服务地址的分配。终结点地址将始终相对于 IIS 分配地址。因此,基于 IIS 的终结点的唯一有效值如下所示:
servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "MyService");
这会将我的服务附加到服务 URL。
我遇到了类似的问题 - 这就是为我修复它的原因:
将其添加到界面顶部:
[ServiceContract(Namespace = "your namespace here")]
在 app.config 中,确保该部分中的服务名称采用 Namespace.Class
希望这有帮助。