2013-07-09 30 views
3

当我把我的基于CSLA-DataPortal了在Azure的云服务,我的WinForms应用程序引发以下异常,当它试图访问我的业务对象:如何为Azure配置CSLA WCF DataPortal?

System.ServiceModel.Security.SecurityNegotiationException:安全 通道不能被打开是因为与远程端点 的安全协商失败。这可能是由于EndpointAddress中指定的EndpointIdentity缺失或不正确,用于创建通道 。请验证 指定或暗示的EndpointIdentity EndpointAddress正确标识远程端点。

(和该内除外)System.ServiceModel.FaultException:该 消息动作 “http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue”不能 处理在接收机处,由于在 EndpointDispatcher一个ContractFilter失配。这可能是因为发件人和收件人之间的合同不匹配 (发件人和收件人之间的不匹配操作)或绑定/安全 不匹配。检查发件人和 接收者是否具有相同的合同和相同的绑定(包括 安全要求,例如消息,传输,无)。

的web.config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <appSettings> 
     <add key="DalManagerType" 
      value="DataAccess.Mock.DalManager,DataAccess.Mock" /> 
     <add key="CslaAuthentication" value="Csla" /> 
    </appSettings> 

    <system.web> 
     <compilation debug="true" targetFramework="4.5" /> 
     <httpRuntime maxRequestLength="2147483647" targetFramework="4.5" /> 
     <pages controlRenderingCompatibilityVersion="4.0" /> 
     <membership defaultProvider="ClientAuthenticationMembershipProvider"> 
      <providers> 
       <add name="ClientAuthenticationMembershipProvider" 
      type= 
    "System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, 
    System.Web.Extensions, Version=4.0.0.0, Culture=neutral, 
    PublicKeyToken=31bf3856ad364e35" 
       serviceUri="" /> 
      </providers> 
     </membership> 
     <roleManager defaultProvider="ClientRoleProvider" enabled="true"> 
      <providers> 
       <add name="ClientRoleProvider" 
type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" 
       cacheTimeout="86400" /> 
      </providers> 
     </roleManager> 
    </system.web> 

    <system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
     <services> 
      <service name="Csla.Server.Hosts.WcfPortal" 
        behaviorConfiguration="returnFaults"> 
       <endpoint binding="wsHttpBinding" 
        bindingConfiguration="wsHttpBinding_IWcfPortal" 
        contract="Csla.Server.Hosts.IWcfPortal" /> 
       <endpoint contract="IMetadataExchange" binding="mexHttpBinding" 
        address="mex" /> 
      </service> 
     </services> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="wsHttpBinding_IWcfPortal" 
          maxReceivedMessageSize="2147483647"> 
        <security mode="None"> 
         <message establishSecurityContext="false" /> 
         <transport clientCredentialType="None" /> 
        </security> 
        <readerQuotas maxBytesPerRead="2147483647" 
         maxArrayLength="2147483647" 
         maxStringContentLength="2147483647" 
         maxNameTableCharCount="2147483647" 
         maxDepth="2147483647" /> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="returnFaults"> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
        <serviceMetadata httpGetEnabled="true" /> 
        <useRequestHeadersForMetadataAddress /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 

    <system.webServer> 
     <modules runAllManagedModulesForAllRequests="true" /> 
     <directoryBrowse enabled="true" /> 
    </system.webServer> 

</configuration> 

的app.config我的WinForms应用程序:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <appSettings> 
     <add key="CslaPropertyChangedMode" value="Windows" /> 
     <add key="CslaDataPortalProxy" 
      value="Csla.DataPortalClient.WcfProxy, Csla" /> 
     <add key="CslaDataPortalUrl" value="http://127.0.0.2:81/WcfPortal.svc" /> 
    </appSettings> 

    <startup> 
     <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> 
    </startup> 

    <system.serviceModel> 
     <bindings> 
      <wsHttpBinding> 
       <binding name="WSHttpBinding_IWcfPortal" 
          maxReceivedMessageSize="2147483647"> 
        <security mode="None" /> 
        <readerQuotas 
         maxBytesPerRead="2147483647" 
         maxArrayLength="2147483647" 
         maxStringContentLength="2147483647" 
         maxNameTableCharCount="2147483647" 
         maxDepth="2147483647"/> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 
     <client> 
      <endpoint 
       address="http://127.0.0.2:81/WcfPortal.svc" 
       binding="wsHttpBinding" 
       bindingConfiguration="WSHttpBinding_IWcfPortal" 
       contract="Csla.Server.Hosts.IWcfPortal" 
       name="WSHttpBinding_IWcfPortal"/> 
     </client> 
    </system.serviceModel> 

</configuration> 

当我浏览到WcfPortal.svc本地或在Azure中的文件,我没有得到任何错误。当我在本地或Azure浏览WcfPortal.svc?wsdl时,我得到正确的XML响应;没有错误。

我已经将这整个解决方案上传到GitHub:AzureHostTest。有两个分支:master分支只包含我尝试在Azure中工作的项目。另一个分支traditionalWCF包含三个附加项目,演示了在Azure中工作的标准WCF服务;我希望能够使用这套工作文件作为比较和指导来设置CSLA项目。

我不确定我应该如何设置我的配置文件,并可以使用一些指导。

+0

如果您尝试.... cloudapp.net/wcfportal.svc?wsdl会发生什么情况? – Rikalous

+0

@Rikalous,我得到有效的XML数据。 –

+0

这可能是与身份验证有关吗?你使用Csla认证(不是Windows)吗? – Rikalous

回答

0

我认为这个问题是您的端点地址... HTTP:// 127.0.0.2:81/WcfPortal.svc

它应该是可能http://yourNamespace.cloudapp.net/WcfPortal.svc或http:// 127.0.0.1/WcfPortal.svc

您可能会在本地环境中获得127.0.0.2:81作为您的主机,因为默认主机可能会被系统中的其他应用程序使用。但在azure中,您的应用默认部署到端口80。

+0

刚刚尝试过,并在我的CSLA应用程序尝试连接到Azure的'http:// azurehosttest.cloudapp.net/WcfPortal.svc'或具有指定端口的本地地址时,我仍然得到我的问题中列出的例外。如果我尝试连接到本地实例而没有指定端口号,那么我会得到一个异常情况,即没有端点侦听等。因此,在后一种情况下没有看到它。我鼓励你在本地运行我的GitHub项目。 –