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

Posted

技术标签:

【中文标题】wcf 服务中 ServiceHost 指令中的服务类型问题【英文标题】:Problem with type of service in ServiceHost directive in wcf service 【发布时间】:2011-07-14 03:03:39 【问题描述】:

我正在开发一个简单的 wcf 服务进行测试。当我使用本地 IIS 7.5 测试此服务时,它可以正常工作。但是当我在 web IIS 中托管它时,我收到了这个错误:

类型“WcfServiceLibrary1.Service1”, 作为服务属性提供 ServiceHost 指令中的值,或 在配置元素中提供 system.serviceModel/serviceHostingEnvironment/serviceActivations 找不到。

而我的 ServiceHost 是:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary1.Service1" %>

请帮我解决这个问题

【问题讨论】:

我认为我的装配有问题 哪些文件您已部署到您的 IIS Web 服务器?您需要:一个包含 *.svc 文件的虚拟目录,以及下面的 bin 目录,其中包含您的 WCF 服务的 DLL 是的,我在我的主机空间中创建了一个目录并将我的所有项目(WcfServiceLibrary1)复制到我的目录(用于测试)。但是我的问题没有解决!!!在我的项目中存在一个 .svc 文件和服务与本地 iis 正常工作 【参考方案1】:

因为我在我查看的任何问题中都找不到这个建议,所以在这里添加我的案例:

我在手动更改文件MyService.svc.cs中的命名空间时遇到了这个问题,并没有更改相应文件MyService.svc中的Service名称 - 原来它需要是Service =“namespace.classname” ”。

【讨论】:

这也吸引了我,同时将我的第一个“Hello World”WCF 服务放在一起。如果您在后面的代码中更改命名空间,请不要忘记右键单击 .svc,选择“显示标记”,正如 Jac 所说,在那里也编辑命名空间。 如果您将外部 WCF 服务应用程序注入到如下所示的 ASP.NET Web 应用程序中,则此命名空间修复也适用。确保在 serviceActivations 中指定了命名空间:&lt;system.serviceModel&gt; &lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true"&gt; &lt;serviceActivations&gt; &lt;add service="MyServicesNamespace.MyService" relativeAddress="~/PathTo/MyService.svc"/&gt; &lt;/serviceActivations&gt; &lt;/serviceHostingEnvironment&gt; &lt;/system.serviceModel&gt; 如果你这样做,你可能还需要允许AspNetCompatibilityRequirementsMode 我在我的项目中发现了同样的问题。我最初添加了一项服务,将其添加到一个文件夹中,然后在该文件夹中添加了另一个服务。复制并粘贴新服务的 Web 配置中的原始服务定义,然后新服务将不起作用:接口、.cs 和配置除了名称之外都匹配。当我最终检查 svc 的标记时,Service 标记中的命名空间与 webconfig 不匹配。我解决了这个问题,它可以工作。 我也收到此错误,因为接口名称与服务名称不同。我有服务名称“MyLog”并将其更改为“MyLogService”,而没有将接口名称更改为“IMyLogService”【参考方案2】:

尝试使用程序集限定类型名称。

这是[Fully Qualified Type Name], [Assembly]

[Fully Qualified Type Name] 在哪里,最常见的情况是YourNamespace.YourType

[Assembly] 在最常见的情况下是YourAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null

它变得比这更复杂(泛型类型、嵌套类型等) - 但在您的情况下不太可能如此。

如果您的应用程序使用默认构建选项,那么我将冒险猜测该指令应该是这样的:

<%@ ServiceHost Language="C#" Debug="true" 
   Service="WcfServiceLibrary1.Service1, 
            WcfServiceLibrary1, 
            Version=1.0.0.0, 
            Culture=neutral, 
            PublicKeyToken=null" %>

虽然你可能想去掉那里的换行符。

另外,请确保您的 dll 已实际部署

【讨论】:

*.dll 文件(包括我的服务)已部署在 Bin 文件夹中 请给我一个具有完全限定类型名称的示例 ServiceHost 感谢您的回答。我使用程序集限定类型名称,但我的问题没有用这种方法解决 不需要(总是)指定程序集版本/等的额外精度。您也许可以逃脱:Service="WcfServiceLibrary1.Service1, WcfServiceLibrary1"【参考方案3】:

我只在发布我的服务时遇到了同样的问题,但它在本地工作。

原来是服务引用了一个未部署的 DLL。这是一个超级特例,因为它是一个系统 dll (System.Web.Helpers),因此项目甚至没有对它的引用,因此“复制本地”没有设置为 true。

【讨论】:

检查起来似乎很荒谬,但我的 DLL 也丢失了。 我有一个未设置为复制本地的 Microsoft.Identity 程序集,它在部署到生产时仅产生此错误,但在本地运行时不会产生此错误。令人难以置信的烦人,但确实如此。 bin\ 文件夹中缺少我的数据服务引用的 dll,从而产生了错误。添加了缺少的 dll,服务正常。【参考方案4】:

IIS 默认期望看到虚拟目录中的 svc 文件,以及 bin 文件夹中的二进制文件(正如 marc_s 所评论的那样)。

但是,WCF 库项目的默认构建配置是在 bin/Debug 文件夹(或 bin/Release)中构建。您可以在项目属性“构建”选项卡上将“输出路径”更改为“bin/”。

今天更改此设置为我解决了此错误。

【讨论】:

WCF 项目的默认输出路径是 bin\ 当我将输出路径更改为 bin\Debug 时,我收到了问题。当我将它改回 bin 时工作正常\【参考方案5】:

在 IIS 中将工作服务部署到新位置(新站点)后,我遇到了同样的问题。在默认网站树下的 inetmgr 中,我没有右键单击新站点并选择转换为应用程序 - 现在一切正常!

【讨论】:

【参考方案6】:

我的问题终于解决了。

我删除了主机中的服务目录,并在主机空间中创建了一个新的虚拟目录。然后我将我的服务复制到我创建它的新目录中。

现在我可以浏览 .svc 文件以获取服务,我的客户端将使用该服务。

我不明白为什么会出现这个问题!我有点迷茫!

【讨论】:

我已将我的目录添加为普通目录,需要将其转换为应用程序。 上面的评论是我必须做的:在我的本地主机中,目录是一个应用程序或虚拟目录,当我部署到 www 时,我只是在上面进行了 ftp 处理。 【参考方案7】:

标记为答案的答案很难理解。事实上,虽然它让我解决了类似的问题,但我不知道是不是因为我准确地理解了作者的意思。

我发现如果我将开发机器上的 IIS 应用程序指向实际的项目目录,其中包含 WCF 服务应用程序所需的 web.config、MyService.svc 和 bin 文件夹,它就无法工作,并且正在抛出这个错误。尽管对每个设置进行了四次检查,并确保一切与其他简单、有效的 WCF 应用程序相同。

最终,我通过发布到不同的目录而不是依赖于项目文件和目录本身来解决问题。

也许是因为当我试图通过 IIS 运行 WCF 应用程序时,文件已在 Visual Studio 中打开?我不知道,但 Visual Studio 提供的 localhost:59871/... 正在工作。我不知道该实例使用的是项目文件还是临时发布的版本。

【讨论】:

伙计,我希望我能投票 1000 次。我花了大约 2 个小时寻找解决方案。【参考方案8】:

检查“服务主机”的“服务”中写的命名空间和类是否正确,应该是Service="namespace.classname"

【讨论】:

这为我解决了问题。单击“转换为 Web 应用程序项目”后运行的转换代码为(以前的网站项目)提供了一个新的命名空间,该命名空间未附加到 svc 文件中的服务类名。【参考方案9】:

此问题的另一个原因通常是当 wcf 服务从一个目录移动到另一个目录时,并且 svc 文件尚未更新...最简单的解决方案是仔细检查您的 .svc 文件并确保服务定义是定义正确。

【讨论】:

【参考方案10】:

由于我目前无法投票 @jeromeyers 回答,我想补充一点,这是我为这个问题找到的解决方案。

有人将一个 svc 文件以及相关的合同和代码文件复制并粘贴到一个新项目中,但他们没有在所有地方更新命名空间和类名。从这个错误开始跟踪这个非常令人沮丧:

" 名称以无效字符开头。错误处理资源 'file:///C:/...

尝试右键单击 .svc 文件并执行“在浏览器中查看”时。

【讨论】:

【参考方案11】:

尽管这与问题(不是 web iis)略有不同:我是通过搜索到达这里的,因为我在尝试调试我的服务时遇到了这个错误——如果你在一个解决方案中有多个服务,就会发生这个错误如果有问题的解决方案尚未构建,因此当您尝试访问它时未创建 DLL。因此,对于那里的任何人,请确保是否在本地运行整个解决方案都已构建!

【讨论】:

【参考方案12】:

在运行嵌入在我的解决方案中的测试项目时遇到此问题。

我必须在浏览器中查看,然后将该链接复制到新的服务引用(删除旧的),然后将其粘贴进去,而不是使用服务引用中的发现实用程序按钮。

【讨论】:

【参考方案13】:

也很奇怪,在查看并尝试了其他建议之后,我仍然收到错误消息: 类型 ',作为 ServiceHost 指令中的 Service 属性值提供,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供。

当然,我们都会得到包含大量 DLL 的大型项目。结果发现我的解决方案中的一些旧组件针对.Net 4.5,而较新的 dll 是使用 4.5.1 构建的。当 4.5 dll 引用 4.5.1 dll .... 不知道为什么我是快乐的小豚鼠,是我团队中第一个发现这个的。虽然修复很明显也很容易,但所有 dll 都针对相同的 .Net 运行时。

只是希望 Visual Studio 会注意到同一解决方案中的 DLL 都应该针对相同的 .Net 运行时并在构建时生成警告/错误,尤其是在我们有解决方案和项目引用且运行时不匹配的情况下...

【讨论】:

在我的情况下原因是相似的。它与 ServiceHost 中缺少对 InterfaceLib 的引用混合在一起,这是由 .svc 文件中指定的服务实现的【参考方案14】:

确保已编译的 dll 已移至服务(IIS 目录) 目录。

例如,有时 Jenkins 不会自动移动它们。

【讨论】:

【参考方案15】:

当我将工作中的 localhost 服务上传到主机上的新位置时,我遇到了同样的问题。 我创建了一个新的虚拟目录并通过 Visual Studio(FTP) 将我的服务发布到它。问题解决了。

【讨论】:

【参考方案16】:

我也遇到了同样的情况,解决方案是创建一个名为“bin”的文件夹并将 dll 放入其中。然后,在 IIS 上刷新网站就可以了

【讨论】:

【参考方案17】:

我也遇到了这个问题,对我来说神奇的是重新启动 IIS。 这是一个非常奇怪的错误。

【讨论】:

【参考方案18】:

第一次在 IIS 中托管 WCF 服务应用程序? 许多人以一种或另一种方式解决了他们的问题。但是,如果一切都是您的解决方案是正确的并且您的错误是关于在 IIS 中托管您的应用程序,那么请确保当您添加网站时您在 IIS 中的物理路径指向解决方案的“bin”目录,如下面的屏幕截图所示。

【讨论】:

【参考方案19】:

请看https://msdn.microsoft.com/en-us/library/ms733766(v=vs.100).aspx

您需要做两件事才能将服务托管在 IIS 上,甚至是在 Visual Studio 的迭代 IIS_EXPRESS 上。

1) 更新 Web.Config 以包含 ServiceActivations

改变:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
  <serviceActivations>
    <add service="API.Service1" relativeAddress="Service1.svc"/>
 </serviceActivations>
</serviceHostingEnvironment>

2) 您需要在根目录下创建一个名为 App_Code 的目录。 您现在需要将服务(例如:Service1.svc)从根目录移动到 App_Code 目录中。 所以你会有 App_Code\Service1.svc

如果您浏览服务 http://localhost:63309/Service1.svc 它应该可以工作。

【讨论】:

以上是关于wcf 服务中 ServiceHost 指令中的服务类型问题的主要内容,如果未能解决你的问题,请参考以下文章

找不到 WCF 数据服务类型

WCF:啥是 ServiceHost?

WCF项目问题1-找不到类型“WCFService.Service1”,它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/ser

WCF中的ServiceHost初始化两种方式

WCF中的ServiceHost初始化两种方式

WCF ServiceHost.Close() 延迟