繁体   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