簡體   English   中英

處理WCF中的端點異常

[英]Handling Endpoint exceptions in WCF

在我的應用程序(Windows Phone)中,我通過代碼生成動態連接到WCF Web服務。 用戶必須指定Web服務的URL然后我創建我的EndPointAddress和Binding,它運行良好。 但是如果用戶輸入了無效的URL,則拋出異常:

“System.ServiceModel.EndpointNotFoundException - >沒有端點偵聽[服務的地址]可以接受消息。這通常是由不正確的地址或SOAP操作引起的。有關詳細信息,請參閱InnerException(如果存在)。”

innerexception非常經典:“遠程服務器在InnerException返回錯誤:NotFound。”

問題:我無法處理此異常。 我嘗試了許多在這里找不到的東西。

有什么解決方案嗎?

我唯一能找到的是參考References中的一些方法,這絕對不是一個好主意......!

提前謝謝你,抱歉我的英文不好:)!

我的實際代碼看起來像這樣,但它沒有捕獲異常=>

        MyServiceClient client = new MyServiceClient(myBinding, myEndpointAddress);
        try
        {
            client.RegisterUserCompleted += new EventHandler<RegisterUserCompletedEventArgs>(client_RegisterUserCompleted);
            client.RegisterUserAsync();
        }
        catch (TimeoutException ex)
        {
            MessageBox.Show(ex.Message);
            client.Abort();
        }

        catch (FaultException ex)
        {
            MessageBox.Show(ex.Message);
            client.Abort();
        }

        catch (CommunicationException ex)
        {
            MessageBox.Show(ex.Message);
            client.Abort();
        }

        catch
        {
            MessageBox.Show("Error");
            client.Abort();
        }
        finally
        {
            client.CloseAsync();
        }

問題已經解決了。 解決方案是:uri必須在創建客戶端之前進行測試。 為此,我創建一個WebRequest並捕獲WebResponse中的異常:

public void ValidateUri(String uri)
    {
        if (!Uri.IsWellFormedUriString(uri, UriKind.RelativeOrAbsolute)) return;
        request = WebRequest.Create(uri);
        request.BeginGetResponse(new AsyncCallback(ValidateUriCallback), null);
    }

    private WebRequest request;
    private void ValidateUriCallback(IAsyncResult result)
    {
        try
        {
            WebResponse httpResponse = (WebResponse)request.EndGetResponse(result);

            // Create the client here
            ServiceClient client = new MyServiceClient(myBinding, myEndpointAddress);
        client.RegisterUserCompleted += new EventHandler<RegisterUserCompletedEventArgs>(client_RegisterUserCompleted);
        client.RegisterUserAsync();

        }
        catch (WebException ex)
        {
            var response = ex.Response as System.Net.HttpWebResponse;
    if (response!=null 
        && response.StatusCode == HttpStatusCode.NotFound)
    {
        Dispatcher.BeginInvoke(delegate()
                {
                    MessageBox.Show("The web service address is not valid", "Sorry", MessageBoxButton.OK);
                 });
    }
        }

您需要將try catch移動到client_RegisterUserCompleted方法並環繞 var x = e.Result;

編輯:由於我的第一種方法是錯誤的...首先,您應該首先檢查您的URL(代碼中的myEndpointAddress)。 您可以在瀏覽器中瀏覽它(您可以在該行上設置斷點,然后復制該值並將其粘貼到您的瀏覽器中)。

如果可行或者當您瀏覽它時顯示錯誤,則將其添加到托管WCF服務的Web應用程序的web.config中。

<system.diagnostics> <sources> <source name="System.ServiceModel" switchValue="Information, ActivityTracing" propagateActivity="true"> <listeners> <add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData= "Trace.svclog" /> </listeners> </source> </sources> </system.diagnostics>

然后運行您的應用程序或瀏覽它。 它將在與Web應用程序相同的目錄中創建Trace.svclog文件。 打開該文件並在紅色條目中查找突出顯示的內容。 這將為您提供有關異常的更多信息。 默認情況下,WCF不會返回完整信息以減慢惡意用戶的速度。

暫無
暫無

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

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