1

我想从 wcf 方法获取异常代码,但我总是得到 NotFound 错误。

客户端:

public MainPage()
    {
        InitializeComponent();
        client.TestCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(TestCompleted);
    }

    void TestCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        if(e.Error!=null)
        {
            //HOW to get here my class BaseFault???
        }
    }

服务器端:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [FaultContract(typeof(BaseFault))]
    void Test(int id);
}

  public void Test(int id)
  {
            try
            {
                if (id == -1)
                    ThrowEx(new BaseFault() { ErrorCode = ProcessErrorsCode.InvalidArgument });
                else
                    throw new NullReferenceException("some server error with null value");
            }
            catch
            {
                ThrowEx(new BaseFault() { ErrorCode = ProcessErrorsCode.InternalServerError });
            }
   }


 public void ThrowEx(BaseFault fault)
 {
    throw new FaultException<BaseFault>(fault);
 }



    [DataContract]
    public class BaseFault
    {
        [DataMember]
        public ProcessErrorsCode ErrorCode { get; set; }
    }

配置(includeExceptionDetailInFaults 设置为 True):

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">

                    <serviceMetadata httpGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="True" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>
</configuration>

我需要在客户端获取 BaseFault 类型。怎么做?

4

4 回答 4

1

Evgeny,您是如何创建客户端代理的?您的客户是否有权访问 BaseFault 类型?你得到什么样的错误(找不到类型,找不到页面,找不到文件)?

于 2010-09-06T14:36:19.480 回答
1

叶夫根尼,

这里的问题是您收到错误 404。这是 WCF 服务之上的级别,由 IIS 处理和返回,因此您的请求永远不会命中您的 WCF 服务。您需要检查服务的端点 URL 以及 .svc 文件/IIS 上的端点 URL,并确保它们相同。我实际上会尝试使用浏览器浏览到端点 URL,看看我得到了什么。

正如您的链接所解释的那样,您需要拥有能够投错的代码,我假设您已经这样做了。

希望这可以帮助。

于 2010-09-07T11:03:50.053 回答
1

为我找到了简单的解决方案:

        bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);

只需添加这行代码,它无需配置即可工作。

于 2010-09-07T12:18:09.110 回答
1

在 Sliverlight 应用程序的 Application_Startup 事件处理程序中添加以下内容:

    bool registerResult = WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
于 2013-12-10T14:45:31.947 回答