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を参照し、何が得られるかを確認します。

あなたのリンクが説明しているように、あなたはフォールトにキャストできるようにするためのコードを持っている必要があります、そして私はあなたがすでにそれをしていると思います。

お役に立てれば。

于 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 に答える