忽略WCF服务属性

时间:2013-11-08 16:19:43

标签: c# asp.net .net wcf

我正在关注如何为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>

1 个答案:

答案 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中找到的值