Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net WCF:是否可以将所有服务设置移到配置文件之外和代码中?_.net_Wcf_.net 3.5 - Fatal编程技术网

.net WCF:是否可以将所有服务设置移到配置文件之外和代码中?

.net WCF:是否可以将所有服务设置移到配置文件之外和代码中?,.net,wcf,.net-3.5,.net,Wcf,.net 3.5,我有一个WCF,现在已经使用了一年多,由其他人编写,我正在尝试重构它,但是文件夹结构的组织方式和包含方法的svc.cs文件不是我从WCF示例中习惯的方式 这就是我想要实现的目标。由于去年没有更改任何设置,我被要求将所有服务设置硬编码为代码。该服务托管在大型现有web应用程序中(我必须将其保留在其中),svc文件包含客户端调用的方法,该svc.cs文件不位于虚拟目录的根目录,而是位于更深的位置,比如说/WebServices/PotatoWebService/PotatoWebService.sv

我有一个WCF,现在已经使用了一年多,由其他人编写,我正在尝试重构它,但是文件夹结构的组织方式和包含方法的svc.cs文件不是我从WCF示例中习惯的方式

这就是我想要实现的目标。由于去年没有更改任何设置,我被要求将所有服务设置硬编码为代码。该服务托管在大型现有web应用程序中(我必须将其保留在其中),svc文件包含客户端调用的方法,该svc.cs文件不位于虚拟目录的根目录,而是位于更深的位置,比如说
/WebServices/PotatoWebService/PotatoWebService.svc
,它不在虚拟目录根目录中会导致任何问题吗

由于我正在将配置移出配置文件,现在我正在web应用程序的global.axax.cs文件中创建服务、主机、端点、绑定,位于
ApplicationStart()
,在web应用程序中启动此服务的正确位置是哪里

是否可以移动代码中的所有内容,不仅仅是端点,还包括web.config文件中的behavior、service和system.ServiceModel的全部内容,以便“清理”配置文件,并停止使用不需要的设置吓唬支持和配置管理者

如果是的话,我已经试了两天来让这个工作没有成功。根据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中没有任何内容,并且想要一个端点服务HasZeroAppendPoints:“服务没有应用程序(非基础设施)端点”

我已经在调试中一步一步地完成了代码,一切看起来都很好,服务已打开,我缺少了什么,有什么建议可以缩小这个问题的范围吗

编辑:从服务主机工厂派生的产品工作得很好,谢谢

您可以编写一个应用程序,在其中可以通过编程方式配置服务,而不是使用配置文件。然后在.svc标记文件中配置此自定义工厂:

<%@ServiceHost Factory="CustomFactory" Service="MyService" %>

在ApplicationStart()中,是 开始这项服务的正确地点 在web应用程序中

不可以。您不能同时拥有ASP.NET运行时托管和通过代码显式托管。但是您可以按照Darin所描述的那样声明自定义服务工厂

它不在虚拟目录根目录中会导致任何问题吗

没问题

另外,我可以问一下为什么要以编程方式执行此操作吗?编写和测试所有这些代码不是很痛苦吗?如果您不喜欢Web.config文件中的那大块WCF配置,可以将WCF配置放在单独的配置文件中

通常,WCF服务的配置方式始终相同。无论是自托管还是IIS托管都没有区别。ServiceHost有一个默认实现,即如何构造服务描述和端点。默认情况下,它将尝试在应用程序配置文件中定位服务配置。在您的例子中,Web.config。在自托管和IIS托管中使用的ServiceHost完全相同

区别在于此ServiceHost的实例化方式。在自托管中,您拥有完全控制权,因为您必须自己创建ServiceHost的实例。在IIS托管的场景中,ASP.NET运行时将使用ServiceHostFactory实例化服务主机

因此,如果要手动配置ServiceHost,必须创建自己的ServiceHostFactory并在SVC文件中引用它

回到你的问题上来:


如果我理解正确,将web.config中的设置自动在iis进程的aspnet_wp.exe中托管服务

“托管”只是指它在Web应用程序中运行。一旦您将服务部署为Web应用程序的一部分,它就会始终由IIS托管。没有其他独立的可执行文件,无论您如何和在何处配置它

并在客户端调用.svc文件时自动启动

在ASP.NET web应用程序中,所有请求的HTTP都通过ASP.NET“管道”。管道有一组处理程序,用于拾取和处理请求。对于WCF,这是System.ServiceModel.Activation.HttpHandler。这个稍微简化的处理程序将检查它是否具有有效的ServiceHost,如果没有,则使用ServiceHostFactory创建一个。处理程序完全不关心您是否已经在Global.asax中创建了ServiceHost

而如果使用global.axax.cs中的ServiceHost.Open()启动它,则会显式启动它,而不是由iis托管

不会。您在web应用程序中运行的任何代码都会在IIS托管的应用程序域中运行

,或仍然由IIS托管,但svc文件被忽略

是的。但更多的是相反的。您的Global.asax代码被忽略,WCF激活仍尝试创建另一个服务主机

然后这里建议的第三个选项,一个从主机工厂派生的类,将从svc调用,服务将以与web.config中的设置相同的方式启动

这是唯一的选择。抓住RedGates反射器(它是免费的)并拆解class ServiceHostFactory。它相当小。你
<configuration>
    <appSettings>
        <add key="ServerConfigPath" value="~/ServerConfig.config"/>
    </appSettings>
</configuration>