WCF,找不到 ServiceHost 指令中的服务属性值

Posted

技术标签:

【中文标题】WCF,找不到 ServiceHost 指令中的服务属性值【英文标题】:WCF, Service attribute value in the ServiceHost directive could not be found 【发布时间】:2009-04-06 09:39:52 【问题描述】:

我正在尝试使用 IIS 6 托管我的服务,但我不断收到此异常。

    Server Error in '/WebServices' Application.
--------------------------------------------------------------------------------

The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[InvalidOperationException: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found.]
   System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(String constructorString, Uri[] baseAddresses) +6714599
   System.ServiceModel.HostingManager.CreateService(String normalizedVirtualPath) +604
   System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +46
   System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +654

[ServiceActivationException: The service '/WebServices/dm/RecipientService.svc' cannot be activated due to an exception during compilation.  The exception message is: The type 'QS.DialogManager.Communication.IISHost.RecipientService', provided as the Service attribute value in the ServiceHost directive could not be found..]
   System.ServiceModel.AsyncResult.End(IAsyncResult result) +15626880
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +15546921
   System.ServiceModel.Activation.HostedHttpRequestAsyncResult.ExecuteSynchronous(HttpApplication context, Boolean flowContext) +265
   System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +227
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +80
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +171




--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.3082; ASP.NET Version:2.0.50727.3082 

除了它似乎找不到我的程序集之外,我完全没有任何线索。代码应使用公共类正确编译。

这是我的 .svc 文件:

<%@ ServiceHost Language="C#" Debug="true" Service="QS.DialogManager.Communication.IISHost.RecipientService" CodeBehind="RecipientService.svc.cs" %>

我试图创建一个非常简单的服务,它只包含任何内容,看看这是否可行,但仍然出现相同的旧错误。

The type 'IISHost.Service1', provided as the Service attribute value in the ServiceHost directive could not be found. 

【问题讨论】:

你能显示service.svc的内容吗? 如果它在程序集中引用了一个预编译的类型,你有没有把它复制到vroot下的bin目录下? 感谢您发布此内容,您的问答刚刚为我解决了同样的问题。 评论因为我显然无法保存... 【参考方案1】:

问题也可能是在 svc 文件中的不同命名空间中,因为它在 svc.cs 文件中。

在svc文件中的命名空间必须是以下格式。

Service="Namespace.SvcClassName"

【讨论】:

这在 VS Express 中尤其常见,它不支持重构,IDE 也不容易显示 svc 文件的内容。 这正是我的问题。我浏览了我的解决方案,并在解决方案中分离了两个项目之间的命名空间,忘记更新 .svc 引用。 你说得对,网络上的大多数教程都在示例 WCF 服务和接口周围放置了一个命名空间,并且需要将其带到 service.svc 页面。 这对我有帮助。我更改了我的命名空间,但无法弄清楚如何在 VS2010 Express 中打开服务文件 (servicename.svc)。我最终去了文件系统并将文件直接打开到记事本++中并在那里进行编辑。【参考方案2】:

选项一

此消息通常是由 IIS 7 配置问题引起的。如果您习惯于创建一个指向您的服务所在文件夹的虚拟目录,那将不再适用。现在,您需要改用“创建应用程序...”选项。

其他选项

WCF: The type provided as the Service attribute could not be found The type , provided as the Service attribute value in the ServiceHost directive could not be found.

【讨论】:

在 IIS 6 上哪里可以找到这个选项? 验证 IIS6 中的虚拟文件夹是 Web 应用程序 你复制到vroot下的bin目录了吗? 是的,现在可以了!我之前误解了你并解决了将子文件夹制作为虚拟应用程序的问题。非常感谢! 在我的情况下,项目输出超出了网站文件夹(通过将输出文件夹更改为“bin\”来修复)【参考方案3】:

我知道这可能是“显而易见”的答案,但它让我有点不知所措。确保 bin 文件夹中有项目的 dll。当服务发布时,发布它的人删除了 dll,因为他认为它们在 GAC 中。专门用于该项目的那个(QS.DialogManager.Communication.IISHost.RecipientService.dll,在本例中)不存在。

由于完全不同的原因导致相同的错误。

【讨论】:

这对我来说似乎有所不同——我们的项目在其他地方输出它的程序集。添加 \bin\Debug 并将 dll 复制到它似乎工作。 谢谢。我忘记在一个分支之后构建我的应用程序,并且想知道为什么 IIS 会抛出这些错误。伙计,我不觉得很傻...... 感谢您发布此内容,显然这对我来说并不明显。【参考方案4】:

由于 .SVC 文件中的服务名称不匹配而发生此错误。可能您可能已经更改了实现接口的服务类的名称。解决方案是打开 .SVC 文件并完全匹配 Service 属性和 CodeBehind 属性。所以你的 .SVC 文件应该是这样的

<%@ ServiceHost Language="Language you are using" Debug="bool value to enable debugging" Service="Service class name that is implementing your Service interface" Codebehind="~/Appcode/Class implementing interface.cs"%>. for eg.

<%@ ServiceHost Language="C#" Debug="true" Service="Product.Service" CodeBehind="~/AppCode/Product.Service.cs"%>

此示例适用于使用 C# 语言的 .svc 文件,已启用调试,Service 类实现接口,该类位于 app 文件夹中,名称为 Service.cs,Product 是 Service 类的命名空间。

另外请在服务配置文件中进行相应的更改。

<system.serviceModel>
    <services>
        <service name="Product.Service" behaviorConfiguration="ServiceBehavior">
            <endpoint address="" binding="wsHttpBinding" contract="Product.Iservice">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <behavior name="ServiceBehavior">
            <serviceMetaData httpGetEnabled="true"/>
            <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
    </behaviors>
</system.serviceModel>

【讨论】:

这是我的问题,后来我将 .svc 文件移动到“客户端”子文件夹中。 .svc 文件中的服务指令缺少这个新文件夹/命名空间:Service="MyServicesProxy.Client.OpenClientService" 没错。谢谢 请注意服务名称区分大小写!作为一个 vb.net 开发人员,这欺骗了我!【参考方案5】:

仔细检查您是否从 .svc 文件的 ServiceHost 指令中引用了正确的类型。方法如下...

    在包含 Web 服务的 VS 项目中,在 XML 编辑器中打开 .svc 文件(右键单击该文件,打开方式...,选择 XML(文本)编辑器,确定)。 注意“服务”属性值。 确保它与您的服务的完全限定类型名称匹配。这包括命名空间 + 类型名称。例如,如果命名空间是“MyCompany.Department.Services”且类名为“MyService”,则 Service 属性值应为“MyCompany.Department.Services.MyService”。

【讨论】:

您应该在 Web 服务编辑器(默认)中打开 SVC 文件,因为 XML 编辑器会给您 XML 验证错误。【参考方案6】:

我有同样的异常,这是由于 .svc 文件中没有正确提及类型

我通过以下修复进行了更正。

如果你的 .svc.cs 有这样的类

namespace Azh.Services.MyApp

    public class WcfApp : FI.IWcfAppService

...


为此,.svc 文件应如下所示

<%@ ServiceHost Language="C#" Debug="true" Service="Azh.Services.MyApp.WcfApp" CodeBehind="WcfApp.svc.cs" %>

【讨论】:

救命!我已重命名我的服务项目和命名空间,但尚未更新。【参考方案7】:

您应该配置您的 bin 文件夹路径以服务本地 bin。

【讨论】:

确实,将 DLL 复制到与 svc 文件路径相同的文件夹中。 C:\Folder\SVC_ServiceFolder\bin。我不得不删除一些重复的配置标签。【参考方案8】:

如果您重命名了任何内容,请验证 (Properties/) AssemblyInfo.cs 以及服务文件中的标头是否正确。

服务名称.svc

<%@ ServiceHost Language="C#" Debug="true" Service="Company.Namespace.WcfApp" CodeBehind="WcfApp.svc.cs" %>

Service.svc.cs 中的命名空间保持一致

【讨论】:

【参考方案9】:

我实际上解决了同样的问题。这是我的建议——错误意味着未找到 Service 属性中引用的对象。要找到对象,应用程序或库必须将输出构建到 bin 文件夹。

您可以编辑应用程序的属性页并指定'bin'的输出路径。

【讨论】:

是的,我的项目属性有“bin\Debug”作为输出路径 - 将其更改为“bin\”。可能与这是一个非常古老的项目文件,现在在 VS2017 中使用。【参考方案10】:

我遇到了这个问题 - 我的服务类型在 GAC 中。如果我将包含该类型的 dll 添加到 bin 文件夹中,它会起作用,但因为它在 GAC 中,这不是我想要的。我最终将此添加到服务的 web.config 中

<system.web>
    <customErrors mode="RemoteOnly" />
    <compilation debug="true" targetFramework="4.0">
        <assemblies>
            <add assembly="[name in GAC], Version=[version in GAC], Culture=neutral, PublicKeyToken=[ac token]" />
        </assemblies>
    </compilation>
</system.web>

而且它不需要 bin 文件夹中的任何 dll 就可以工作。

【讨论】:

获取 dll 限定名的有用脚本:***.com/a/17396640/681538【参考方案11】:

对于某些风格的“找不到 ServiceHost 指令中的服务属性值”的两个关键问题:(1) 如果您在 Silverlight 中工作,您应该使用 Silverlight WCF-Enabled 服务,而不是非 Silverlight WCF 服务;这将更新绑定的 Web.Config 并允许类型可见; (2) 将新服务中的类名与服务名相匹配——这里的目标是制作一个 wsdl... 以便您知道该服务的功能向您的 Silverlight 客户端和 Web 公开;它有助于让服务与班级相匹配。如果您弄乱了名称,则必须在 3 个位置(服务行为、服务和绑定)编辑 Web.Config。

有很多真诚的尝试来帮助人们解决这个问题,但对我没有帮助,所以应该强调的是,这篇文章是针对 Silverlight 解决方案的,它可能不适用于未在客户端中使用 Silverlight 3 的人/Web 配置。

希望对你有帮助。

【讨论】:

【参考方案12】:

我遇到了同样的问题,但不知道是什么原因造成的。我通过使用调试/启动新实例从调试更改为发布和运行解决了这个问题。之后,它在 Release 和 Debug 中运行。太神奇了……

【讨论】:

这恰好是当我在同一个解决方案中有一个 Web UI 和 Web 服务项目时。如果 Web Service 不被理解为 Web UI 的依赖项,则 Web Service 不会编译。【参考方案13】:

我在尝试 Microsoft.ServiceModel.Samples.Calculator WCF 示例时也遇到了这个问题。我正在使用 IIS 5.1。我通过确保自动生成的网站(servicemodelsamples)不是应用程序来解决它。右键单击文件夹,单击“属性”,然后单击“创建”按钮。

【讨论】:

【参考方案14】:

我的服务 dll 位于 svc 文件所在的 bin 文件夹中。将 dll 移至 bin 根文件夹即可解决问题。

【讨论】:

【参考方案15】:

在我的情况下,右键单击虚拟目录并选择“转换为应用程序”工作!

【讨论】:

为我工作,感谢 Atul,听起来这就是这里大多数请求者的解决方案!【参考方案16】:

我今天遇到了这个错误,原因是; IIS 用户无权访问应用程序文件夹。我授予了应用根文件夹的读取权限。

【讨论】:

【参考方案17】:

这听起来可能微不足道,但值得一提: 您必须构建服务(在 Visual Studio 中) - 然后将在 bin 子文件夹。

当服务在服务器上“部署”时 - 该 bin 文件夹中需要包含该 DLL 文件 - 否则将引发此错误...

【讨论】:

【参考方案18】:

在您的服务中添加服务引用或复制 dll。

【讨论】:

好的答案在合理程度上扩展了他们的观点——也许你可以添加一些额外的信息?例如,如何你这样做? 为什么你应该这样做? @Swadq 好的答案实际上回答了这个问题;添加网络参考与创建服务不同,这就是这个问题。在服务创建并可以访问之后添加对服务的引用。【参考方案19】:

在添加服务引用之前构建解决方案解决了我的问题。

【讨论】:

【参考方案20】:

尝试在同一解决方案中为第一个启用 Silverlight 的 WCF 添加服务引用时出现此错误。我刚刚构建了 .Web 项目,它开始工作了..

【讨论】:

【参考方案21】:

我遇到了同样的问题,找到了这个帖子,除了nogo之外都试过了。

然后我又浪费了 4 个小时。

然后我发现编译设置已经从64位变成了x86。当我将它改回 64 位时,它起作用了。不知道具体原因,但可能是 IIS 应用程序池未设置为允许 32 位应用程序。

【讨论】:

【参考方案22】:

    确保标记 (svc) 文件具有带有 namespace.classname 的服务属性,并且代码隐藏将为 classname.svc.cs

    重建解决方案

    从本地 IIS 重新启动应用程序池一次。

【讨论】:

以上是关于WCF,找不到 ServiceHost 指令中的服务属性值的主要内容,如果未能解决你的问题,请参考以下文章

找不到 WCF 数据服务类型

wcf 服务中 ServiceHost 指令中的服务类型问题

WCF中的ServiceHost初始化两种方式

WCF中的ServiceHost初始化两种方式

WCF:啥是 ServiceHost?

WCF:如何从 ServiceHost 获取端点列表?