1

どんなに頑張っても、Silverlight で WCF の障害を処理できないようです。実際、エラーはサーバーから離れないようです。

たとえば、デバッグすると、処理されなかったと言って FaultException をスローする行で停止します。

[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class StoreService : IStoreContract
{
    public System.Collections.Generic.List<string> GetStoreDesignNames()
    {
        try
        {
            StoreDataContext swdc = new StoreDataContext();
            var query = from storeDesign in swdc.StoreDesignDBs select storeDesign.Name;
            return query.ToList();
        }
        catch (System.Data.SqlClient.SqlException sqlExcept)
        {
            throw new FaultException<SqlFault>(new SqlFault() { Message = sqlExcept.Message });
        }
    }
}

このメソッドを実装するクラスは、コントラクト インターフェイスから派生します。

[ServiceContract(Namespace = "Store")]
public interface IStoreContract
{
    /// <summary>
    /// Obtain the list of store design names.
    /// </summary>
    [OperationContract,
     FaultContract(typeof(SqlFault))]
    List<String> GetStoreDesignNames();
}

SqlFault クラスは次のように定義されます。

public class SqlFault
{
    public String Message { get; set; }
}

クライアント側では、次のようにエラーを処理します。

        // swc is the client
        swc.GetStoreDesignNamesCompleted += new EventHandler<ServiceReference.GetStoreDesignNamesCompletedEventArgs>((obj, evt) =>
        {
            if (evt.Error == null)
            {
                // In case of success
                MessageBox.Show(evt.Result.First());
            }
            else if (evt.Error is FaultException<ServiceReference.SqlFault>)
            {
                FaultException<ServiceReference.SqlFault> fault = evt.Error as FaultException<ServiceReference.SqlFault>;
                Dispatcher.BeginInvoke(() =>
                {
                    ErrorWindow ew = new ErrorWindow(fault.Detail.Message, "No details");
                    ew.Show();
                });
            }
        });
        swc.GetStoreDesignNamesAsync();

インターフェイスに [SilverlightFaultBehavior] 属性を設定しようとしましたが、役に立ちませんでした。インターフェイスがなくても、このエラーが発生します。

ここで説明されているように、web.config で動作拡張を使用しようとしましたが、拡張が無効であるという警告が表示されます。

Siverlight で WCF 障害を適切に処理するにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

1

私は WCF を使用したことがありません (WCF RIA Services を使用しています) が、少し前にこの記事に出くわしました。

「サーバーが見つかりません」よりも優れたものを取得します。Silverlight の WCF から

于 2013-01-26T01:43:40.507 に答える
0

これと何時間も戦った後、私はついにうまくいく何かを一緒にハックしました。これは本当に恐ろしいハックであり、このタスクにはBehaviorExtensionを使用する方がはるかに望ましいでしょう。秘訣は、次のようにWCFメソッドの本体にHTTPステータスコードを手動で設定することです。

    public System.Collections.Generic.List<string> GetStoreDesignNames()
    {
        try
        {
            StoreDataContext swdc = new StoreDataContext();
            var query = from storeDesign in swdc.StoreDesignDBs select storeDesign.Name;
            return query.ToList();
        }
        catch (System.Data.SqlClient.SqlException sqlExcept)
        {
            System.ServiceModel.Web.WebOperationContext ctx = System.ServiceModel.Web.WebOperationContext.Current;
            ctx.OutgoingResponse.StatusCode = System.Net.HttpStatusCode.OK;
            throw new FaultException<SqlFault>(new SqlFault() { Message = sqlExcept.Message });
        }
    }

その後、エラーメッセージがクライアント側に正しく表示されます。誰かがこれよりも良い解決策を持っているなら、私はそれを聞きたいです。

于 2012-04-20T23:40:13.937 に答える