我正在关注如何为WCF服务实现用户名身份验证的this MSDN article。
在步骤5中,在服务上设置attribute: [AspNetCompatibilityRequirements]
以配置ASP.NET兼容模式的WCF服务。这是必需的,因为身份验证由HTTP模块完成,您必须能够从HTTP上下文中获取主体和身份,以便在WCF中以命令性或声明性方式授权用户。
当我运行该服务时,收到此错误消息:
无法激活该服务,因为它不支持ASP.NET 兼容性。为此应用程序启用了ASP.NET兼容性。 在web.config中关闭ASP.NET兼容模式或添加 AspNetCompatibilityRequirements属性为服务类型 RequirementsMode设置为“允许”或“必需”。
似乎即使我明确声明了它被忽略的属性。这可能是什么原因? 即使我将值更改为AspNetCompatibilityRequirementsMode.Allowed它也不起作用。由于IIS没有理由抱怨,因此需要使用相同的错误消息!
服务
namespace MyNamespace.IISServiceHost
{
[ServiceBehavior(MaxItemsInObjectGraph = int.MaxValue)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class CompanyNameAPIService
{
public CompanyNameAPIService()
{
}
}
}
接口
namespace MyNamespace
{
[ServiceContract]
public interface ICompanyAPI
{
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role="WSIuser")]
[ServiceKnownType(typeof(Supplier))]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
void AddUpdateSuppliers(int companyId, Supplier[] sups);
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "WSIuser")]
[ServiceKnownType(typeof(Dimension))]
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
void AddUpdateDimension(int companyId, Dimension dims);
...
}
}
我还在 Web.config 中设置了等效项。
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="True" multipleSiteBindingsEnabled="true" />
<service behaviorConfiguration="ServiceBehavior" name="MyNamespace.IISServiceHost.CompanyAPIService">
<endpoint address="" behaviorConfiguration="largeDataBehavior"
binding="basicHttpBinding" bindingConfiguration="BasicBindingConfiguration"
name="BasicEndpoint" contract="MyNamespace.ICompanyAPI" />
<endpoint address="help" behaviorConfiguration="helpPageBehavior"
binding="mexHttpsBinding" bindingConfiguration="" name="MexEndpoint"
contract="MyNamespace.ICompanyAPI"
kind="mexEndpoint" endpointConfiguration="" />
</service>
<bindings>
<basicHttpBinding>
<binding name="BasicBindingConfiguration"><security mode="Transport" /></binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="webBinding">
<security mode="Transport"><transport clientCredentialType="None" /></security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="largeDataBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
<enableWebScript />
</behavior>
<behavior name="helpPageBehavior">
<webHttp helpEnabled="true" />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpsGetEnabled="true" httpsGetUrl="https://localhost/WSI/service.svc/wsdl" />
<serviceDebug httpsHelpPageEnabled="true" includeExceptionDetailInFaults="true" />
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="WSIRoleProvider">
<authorizationPolicies>
<add policyType="myNamespace.AuthorizationPolicy.HttpContextPrincipalPolicy, AuthorizationPolicy, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</authorizationPolicies>
</serviceAuthorization>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
答案 0 :(得分:2)
我终于让我的服务工作了。我发布这个以防有人遇到这个问题。 有几个问题所以我逐一回答。
忽略服务属性
我的Visual Studio解决方案包含Service-Project和ServiceHost项目。服务项目有app.config
,ServiceHost有web.config
。
我不知道的是,即使该服务是在web.config中定义的,并非所有设置都受到尊重,因此您必须在app.config文件中进行配置。这对我来说太混乱了,因为当服务发布到IIS时app.config文件消失了。我仍然不知道它是如何工作的,但确实如此。
服务名称属性
我修复了第一个问题后,服务发布成功,我可以使用浏览器导航到它。 WSDL配置也可用(很好)。但是,当我尝试调用任何公开的服务方法时,我得到了“404 not found
”或“There was no channel actively listening at 'xxx'
”。
经过长时间尝试发现问题后,我在跟踪日志中发现了此错误:No matching <service> tag was found
。
这很奇怪,因为我知道服务及其端点配置正确。
这里的问题是服务的名称。根据StackOverflow上的众多问题,名称应采用“Complete.Namespace.Classname
”的格式。如果服务托管在IIS中,显然不是这样。那么服务名称应该是在文件service.svc中的@ServiceHost标记属性Service
中找到的值