WCF 服务在 Server 2012 R2 上工作,但在 2016 上抛出错误
WCF Service works on Server 2012 R2 but throws error on 2016
我在 Server 2012R2 上有一个 WCF 服务 运行。我尝试将服务移至 Server 2016 并开始出现以下错误:
The type 'MyService', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.
我从字面上将整个目录从一台服务器移到了另一台服务器 -- 所以所有的代码和设置都是一样的。
我的服务在 web.config
中配置如下:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
<services>
<service name="MyService" behaviorConfiguration="BehaviorConfig">
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="json" contract="IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
我的 myservice.svc
看起来像这样:
<%@ ServiceHost Language="C#" Debug="true" Service="MyService" CodeBehind="~/App_Code/MyService.cs" %>
是的,包含该服务的 .dll 在我的 Bin
目录中。
我的服务定义如下所示:
[ServiceContract(Namespace="")]
public interface IMyService
{
[OperationContract]
[WebInvoke(Method ="POST", RequestFormat=WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
string Validate(string userId, string userText);
[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
void UserName(string userId);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService: BaseService, IMyService
{
//Implementation here
}
所以我读了很多帖子,这些帖子表明 .svc
文件应该包含服务类型——包括命名空间。但是,在我的例子中没有命名空间。
该项目以 .NET Framework 4.6.1 为目标。
我错过了什么?
我在windows服务器2012 R2上发布了WCF服务,文件目录如下:
bin目录下的文件:
然后我把整个目录复制到windows server 2016 就可以运行成功了。
我在这个过程中没有遇到任何问题,你可以参考我复制到windowsserver 2016的文件。你需要检查你的目录中是否缺少某些文件。如果还是不行,建议你在2016年重建项目再部署。
我终于搞定了。经过数小时的折腾,我终于意识到在原来的服务器上,我的服务 sub-folder 也已经成为了自己的 Web 应用程序。 IOW,我在 Web 应用程序中有一个 Web 应用程序。
在新服务器上,我没有将服务 sub-folder 变成 Web 应用程序。
我在 Server 2012R2 上有一个 WCF 服务 运行。我尝试将服务移至 Server 2016 并开始出现以下错误:
The type 'MyService', provided as the Service attribute value in the ServiceHost directive, or provided in the configuration element system.serviceModel/serviceHostingEnvironment/serviceActivations could not be found.
我从字面上将整个目录从一台服务器移到了另一台服务器 -- 所以所有的代码和设置都是一样的。
我的服务在 web.config
中配置如下:
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
<services>
<service name="MyService" behaviorConfiguration="BehaviorConfig">
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="json" contract="IMyService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
我的 myservice.svc
看起来像这样:
<%@ ServiceHost Language="C#" Debug="true" Service="MyService" CodeBehind="~/App_Code/MyService.cs" %>
是的,包含该服务的 .dll 在我的 Bin
目录中。
我的服务定义如下所示:
[ServiceContract(Namespace="")]
public interface IMyService
{
[OperationContract]
[WebInvoke(Method ="POST", RequestFormat=WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
string Validate(string userId, string userText);
[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
void UserName(string userId);
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class MyService: BaseService, IMyService
{
//Implementation here
}
所以我读了很多帖子,这些帖子表明 .svc
文件应该包含服务类型——包括命名空间。但是,在我的例子中没有命名空间。
该项目以 .NET Framework 4.6.1 为目标。
我错过了什么?
我在windows服务器2012 R2上发布了WCF服务,文件目录如下:
bin目录下的文件:
然后我把整个目录复制到windows server 2016 就可以运行成功了。
我在这个过程中没有遇到任何问题,你可以参考我复制到windowsserver 2016的文件。你需要检查你的目录中是否缺少某些文件。如果还是不行,建议你在2016年重建项目再部署。
我终于搞定了。经过数小时的折腾,我终于意识到在原来的服务器上,我的服务 sub-folder 也已经成为了自己的 Web 应用程序。 IOW,我在 Web 应用程序中有一个 Web 应用程序。
在新服务器上,我没有将服务 sub-folder 变成 Web 应用程序。