WCF,在ServiceHost指令中找不到Service属性值


75

我正在尝试使用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" %>

我试图创建一个非常简单的服务,其中仅包含nothin,也可以查看是否可行,但仍会显示相同的旧错误。

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

您可以显示service.svc的内容吗?
Konstantin Tarkus,2009年

1
如果它引用了程序集中的预编译类型,是否将其复制到vroot下的bin目录中?
康斯坦丁·塔尔库斯

2
<%@ ServiceHost语言=“ C#” Debug =“ true” Service =“ QS.DialogManager.Communication.IISHost.RecipientService” CodeBehind =“ RecipientService.svc.cs”%>
nandarya

1
感谢您发布此信息,您的问答对我来说已经解决了相同的问题。
Pauk)

评论,因为我显然无法保存...
Joshua Drake

Answers:


66

选项一

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

其他选项


1
在IIS 6上哪里可以找到此选项?
nandarya

2
验证IIS6中的虚拟文件夹是Web应用程序
Konstantin Tarkus 09年

2
您是否已将其复制到vroot下的bin目录中?
康斯坦丁·塔库斯

4
是的,现在可以了!我之前误解了您,并解决了将子文件夹制作成虚拟应用程序的问题。非常感谢!
nandarya

3
以我
为例

72

问题也可能是svc文件中的名称空间与svc.cs文件中的名称空间不同。

在svc文件中,名称空间必须采用以下格式。

Service="Namespace.SvcClassName"

1
这在不支持重构的VS Express中尤其常见,并且IDE无法轻松显示svc文件的内容。
Chriseyre2000

2
这是我的确切问题。我经历了我的解决方案,并在解决方案中的两个项目之间分离了名称空间,却忘记了更新.svc参考。
2012年

2
您已将其钉牢,网络上的大多数教程都在示例WCF服务和接口周围放置了一个名称空间,并且需要将其带到service.svc页面。
htm11h 2014年

2
这对我有帮助。我更改了名称空间,但无法弄清楚如何在VS2010 Express中打开服务文件(servicename.svc)。我最终转到文件系统,然后直接将文件打开到notepad ++中并在其中进行编辑。
Andrew MacNaughton 2014年

32

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

同样的错误,原因非常不同。


1
这对我来说似乎有所不同-我们的项目将其组装输出到其他地方。添加\ bin \ Debug并将dll复制到它似乎可行。
Tom W

谢谢。我忘了在分支后再构建应用程序,并且想知道为什么IIS会抛出这些错误。伙计,我不觉得很傻吗
Dudemanword 2014年

感谢您发布此信息,显然这对我来说并不明显。
Saumil '19

11

由于.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.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>

1
这是我的问题,后来我将.svc文件移动到“客户端”子文件夹中。.svc文件中的服务指令缺少此新文件夹/命名空间:Service="MyServicesProxy.Client.OpenClientService"
Iztoksson

究竟。谢谢
Bhuwan Pandey

还要注意,服务名称区分大小写!作为vb.net开发人员,这欺骗了我!
J.Hudler '17

9

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

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

您应该在Web服务编辑器中打开SVC文件(默认设置),因为XML编辑器会给您XML验证错误。
DanM7 2015年

7

我有同样的异常,这是由于.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" %>

救生员!我已经重命名了我的服务项目和名称空间,但是尚未更新。
arviman 2015年

5

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


1
实际上,将DLL复制到与svc文件相同路径的文件夹中是可行的。C:\Folder\SVC_ServiceFolder\bin。我不得不删除一些重复的配置标签。
少年梅耶

3

如果您已重命名,请验证(属性/) AssemblyInfo.cs以及服务文件中的标头是否正确。

ServiceName.svc

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

与您的名称空间对齐 Service.svc.cs


2

我几乎解决了同样的问题。这是我的建议-错误表示未找到Service属性中引用的对象。对于要找到的对象,应用程序或库必须将输出生成到bin文件夹。

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


是的,我的项目属性的输出路径具有“ bin \ Debug”-将其更改为“ bin \”。这可能与VS2017现在使用的非常老的项目文件有关。
joanygaard

2

我遇到了这个问题-我的服务类型在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合格名称的有用脚本:stackoverflow.com/a/17396640/681538
Alex

1

对于“无法找到ServiceHost指令中的Service属性值”的某些样式,有两个解决方案:(1)如果您在Silverlight中工作,则应使用Silverlight WCF-Enabled Service,而不是非Silverlight。 Silverlight WCF服务;这将更新Web.Config的绑定,并允许该类型可见;(2)将新服务中的类名与服务名相匹配-这里的目标是创建一个wsdl ...,以便您知道该服务的功能已在Silverlight客户端和Web上公开;这有助于使服务与类别相匹配。如果您弄不清楚这些名称,则必须在3个地方(serviceBehaviors,services和bindings)编辑Web.Config。

有太多真诚的尝试帮助人们解决了这个问题,但这些尝试对我无济于事,应该强调的是,本文仅适用于Silverlight解决方案,不适用于未在客户端/ Web配置中使用Silverlight 3的用户。 。

希望能帮助到你。


1

我有同样的问题,但不知道是什么原因造成的。我通过从“调试”更改为“释放”并使用“调试/启动新实例运行”来解决了该问题。之后,它同时在Release和Debug中运行。太神奇了...


碰巧是在同一解决方案中有一个Web UI和Web Service项目时。如果Web服务不能理解为Web UI的依赖项,则不会编译。
StingyJack

1

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



1

以我为例,右键单击虚拟目录,然后选择“转换为应用程序”即可!


1
感谢Atul,为我工作了,这似乎是这里大多数请求者的解决方案!
Erdinc Ay


1

这听起来很琐碎,但值得一提:您必须构建服务(在Visual Studio中)-然后将在bin子文件夹中创建一个DLL。

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


0

在您的服务中添加服务参考或复制dll。


1
好的答案会在一定程度上扩展他们的观点-也许您可以添加一些额外的信息?例如,您如何做到这一点?你为什么要这样做?
Swadq

@Swadq好答案实际上回答了这不是的问题;添加网络参考不同于创建服务,这就是问题所在。您可以在创建服务并对其进行访问之后将引用添加到该服务。
理查德·巴克

0

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


0

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


0

我遇到了同样的问题,找到了这个线程,除了nogo以外,全部尝试了。

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

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


0
  1. 确保标记(svc)文件具有带有namespace.classname和codebehind的服务属性为classname.svc.cs

  2. 重建解决方案

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.