3

CSLA ベースの DataPortal を Azure のクラウド サービスに配置すると、WinForms アプリケーションがビジネス オブジェクトにアクセスしようとすると、次の例外がスローされます。

System.ServiceModel.Security.SecurityNegotiationException: リモート エンドポイントとのセキュリティ ネゴシエーションが失敗したため、セキュリティで保護されたチャネルを開くことができません。これは、チャネルの作成に使用された EndpointAddress に EndpointIdentity が存在しないか、正しく指定されていないことが原因である可能性があります。EndpointAddress によって指定または暗示された EndpointIdentity がリモート エンドポイントを正しく識別していることを確認してください。

(およびこの内部例外) System.ServiceModel.FaultException: The message with Action ' http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue ' cannot be processing at the receiver, due to a ContractFilter EndpointDispatcher での不一致。これは、コントラクトの不一致 (送信者と受信者の間のアクションの不一致) または送信者と受信者の間のバインディング/セキュリティの不一致が原因である可能性があります。送信者と受信者が同じコントラクトと同じバインド (メッセージ、トランスポート、なしなどのセキュリティ要件を含む) を持っていることを確認します。

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>

私のWinFormsアプリのapp.config:

<?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>

ローカルまたは Azure で WcfPortal.svc ファイルを参照しても、エラーは発生しません。ローカルまたは Azure で WcfPortal.svc?wsdl を参照すると、適切な XML 応答が返されます。エラーなし。

このソリューション全体を GitHub: AzureHostTestにアップロードしました。ブランチは 2 つあります。masterブランチには、Azure で作業しようとしているプロジェクトだけが含まれています。もう 1 つの分岐でtraditionalWCFある には、Azure で動作する標準の WCF サービスを示す 3 つの追加プロジェクトが含まれています。CSLA プロジェクトをセットアップするための比較とガイダンスとして、その作業用ファイル セットを使用したいと考えていました。

構成ファイルをどのように設定すればよいかわからず、いくつかのガイダンスを使用できます。

4

1 に答える 1

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 にデプロイされます。

于 2013-07-13T22:12:02.703 に答える