【发布时间】:2011-03-05 13:15:35
【问题描述】:
我有一个使用了一年多的 WCF,由其他人编码,我正在尝试重构它,但文件夹结构的组织方式和包含方法的 svc.cs 文件不是我的习惯了 WCF 示例我 completed.
这就是我想要实现的目标。由于去年没有更改任何设置,因此我被要求将所有服务设置硬编码为代码。该服务托管在大型现有 Web 应用程序中(我必须将其保留在那里),svc 文件包含客户端调用的方法,并且此 svc.cs 文件不位于虚拟目录的根目录,而是更深入一点,比如说<virtualDirectory>/WebServices/PotatoWebService/PotatoWebService.svc,让它不在虚拟目录根目录中会不会导致任何问题?
由于我将配置从配置文件中移出,我现在正在 Web 应用程序的 global.axax.cs 文件中创建服务、主机、端点、绑定,地址为 ApplicationStart(),这是正确的起点Web 应用程序中的此服务?
是否可以移动代码中的所有内容,不仅是端点,还包括 web.config 文件中的行为、服务和 system.ServiceModel 的全部内容,以便“清理”配置文件并停止用他们不需要的设置吓唬支持和配置经理?
如果是这样,我已经尝试了 2 天来让它工作但没有成功。根据 netstat,我现在拥有的是一个正在运行的服务,但是当我在浏览器中打开我的 svc 文件时,会弹出一个异常,提示该服务定义了任何端点,尽管根据 nstat 我有一个正在运行的服务:
netstat -a | find LISTENING
...
TCP machineName:8097 elamontagne.potato.com:0 LISTENING
...
所以我有一个服务正在运行,但是一个 svc 文件不知道它并且不能使用它的端点,一个客户端试图联系该服务并且由于服务没有端点而找不到它,任何缩小范围的提示解决问题,解决这种情况的提示?
//Address
string hostingAddress = "PotatoVirtualDirectory/PotatoService/PotatoService.svc";
// Binding
BasicHttpBinding PotatoServiceBinding = ConfigurePotatoServiceBinding(serviceSecurityMode);
// Contract
Type PotatoContract = typeof(IPotatoService);
// Host
this.PotatoServiceHost = new ServiceHost(typeof(PotatoService), new Uri("http://localhost:8097"));
// Endpoint
this.PotatoServiceHost.AddServiceEndpoint(PotatoContract, PotatoBinding, hostingAddress);
// Behavior
ConfigurePotatoServiceBehavior(this.PotatoServiceHost, PotatoServiceBinding);
// Name
this.PotatoServiceHost.Description.Name = "PotatoNamespace.PotatoService";
//Start!
this.PotatoServiceHost.Open();
这编译并运行,它为我提供了一个处于打开状态的运行服务。客户端无法在其通常位置找到它,并且 svc 文件抱怨它在 web.config 中没有任何内容并想要一个端点 ServiceHasZeroAppEndpoints: "Service has zero application (non-infrastructure) endpoints"
我已经在调试中逐步完成了代码,一切看起来都很好,服务是开放的,我缺少什么,有什么技巧可以缩小这个问题的范围吗?
编辑:从服务主机工厂派生效果很好,谢谢!
【问题讨论】: