簡體   English   中英

Windows Phone錯誤處理:具有BasicHttpBinding和TransportWithMessageCredential的WCF

[英]Windows Phone Error Handling: WCF with BasicHttpBinding and TransportWithMessageCredential

提供適當的憑據時,我有一個WCF服務可以正常工作。

當我嘗試使用錯誤的憑證使用該服務時,該服務將按預期方式發送MessageSecurityException錯誤,並且收到錯誤消息: "MessageSecurityException was unhandled by user code"

我不確定如何處理此異常,因為該異常是在自動生成的Reference.cs文件中引發的,並且不在我的控制之下:

References.cs

public string EndLogin(System.IAsyncResult result) {
    object[] _args = new object[0];
    string _result = ((string)(base.EndInvoke("Login", _args, result))); //Here is the error raised
    return _result;
}

理想的方法是檢查service是否已接受憑據,而不是依靠引發的錯誤,但不知道如何檢查此錯誤。

希望有人可以幫助我,這樣我的應用程序就不必在每次錯誤登錄時都崩潰;)

Web.config:服務:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>

    <services>
      <service name="BiBasicService.SalesMarketingService">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding"
          contract="BiBasicService.ISalesMarketingService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBinding">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>

          <!-- To enable custom Role validation -->
          <serviceAuthorization principalPermissionMode="Custom">
            <authorizationPolicies>
              <add policyType="BiBasicService.Security.AuthorizationPolicy, BiBasicService" />
            </authorizationPolicies>
          </serviceAuthorization>

          <!-- To enable custom Username and Password validator-->
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="BiBasicService.Security.CustomValidator, BiBasicService"/>
          </serviceCredentials>

        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

ServiceReferences.ClientConfig:客戶端:

<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_ISalesMarketingService" maxBufferSize="2147483647"
                    maxReceivedMessageSize="2147483647">
                    <security mode="TransportWithMessageCredential" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="https://PUBLICDOMAIN/BasicHttp/SalesMarketingService.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ISalesMarketingService"
                contract="ServiceReference1.ISalesMarketingService" name="BasicHttpBinding_ISalesMarketingService" />
        </client>
    </system.serviceModel>
</configuration>

MessageSecurityException:這是一個綁定錯誤。

確保server sideclient sidebinding configuration必須匹配。 請發布serverweb.configclientweb.config

您可能需要研究IErrorHandler接口,該接口使您可以在更“全局”的級別上處理異常。 IErrorHandler是一個擴展,它允許在引發異常時明確控制應用程序的行為,實現IErrorHandler接口並將其添加到Dispatcher的ErrorHandlers屬性。 IErrorHandler使您可以顯式控制生成的SOAP錯誤,確定是否將其發送回客戶端,並執行相關的任務,例如日志記錄。 錯誤處理程序按照將其添加到ErrorHandlers屬性的順序進行調用。

http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.ierrorhandler.aspx
http://blogs.msdn.com/b/carlosfigueira/archive/2011/06/07/wcf-extensibility-ierrorhandler.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM