SilverLight

SilverLight上WCFサービスの設定

 SilverLightに向け、サーバー側で発生する例外をクライアントへ通知するため、下記のURLのように、実装する必要があります。

http://msdn.microsoft.com/ja-jp/library/dd470096(en-us,VS.96).aspx

※注意点

■behaviorExtensionsに宣言したビヘイビアの「Type」要素に型名とアセンブリ名の間に必ずスペースを入れてください。入れないと、認識されません。

誤る例:

<behaviorExtensions>
       <add name="mySilverlightFaultsBehavior" type="WCFServices.SilverlightFaultBehavior,WCFServices,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
</behaviorExtensions>

正しい例:(スペースに注目してください。)

<behaviorExtensions>
       <add name="mySilverlightFaultsBehavior" type="WCFServices.SilverlightFaultBehavior, WCFServices, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>

参考情報

http://connect.microsoft.com/wcf/feedback/details/216431/wcf-fails-to-find-custom-behaviorextensionelement-if-type-attribute-doesnt-match-exactly

■FaultException<T>を利用して、例外をスローする場合、Tのクラス内にException型のプロパティを定義できません、定義したら、SilverLightクライアント側、FaultExceptionの例外を認識できなくなります。

http://msdn.microsoft.com/ja-jp/library/ms733721.aspx

カスタマイズ例外クラスの利用

 System.ServiceModel.FaultException<ErrorInfo>のようなサービス側のカスタマイズした例外クラスは、Silverlight側のクライアントが分かるため、Web.Configファイルに下記にようにWCFを設定する必要があります。

 <system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <!-- ポイント -->
        <add name="customSilverlightFaultsBehavior" type="SilverlightClassLibrary.WCF.SilverlightFaultBehavior, SilverlightClassLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </behaviorExtensions>
    </extensions>
 
    <bindings>
      <customBinding>
        <binding name="BusinessApplication1.Web.Services.Service1.customBinding1">
          <binaryMessageEncoding />
          <httpTransport transferMode="Streamed" />
        </binding>
      </customBinding>
    </bindings>
    
    <services>
      <service name="BusinessApplication1.Web.Services.Service1">
        <endpoint address="" binding="customBinding" bindingConfiguration="BusinessApplication1.Web.Services.Service1.customBinding1"
         contract="BusinessApplication1.Web.Services.Service1" behaviorConfiguration="SilverlightFaultBehavior" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    
    <behaviors>
      <endpointBehaviors>
        <!-- ここはポイント -->
        <behavior name="SilverlightFaultBehavior">
          <customSilverlightFaultsBehavior />
        </behavior>
    </endpointBehaviors>
 
    <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
 </system.serviceModel>

customSilverlightFaultsBehavior のクラス

using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Configuration;

namespace ServerFramework.WCF
{
    public class SilverlightFaultBehavior : BehaviorExtensionElement, IEndpointBehavior
    {
        public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
        {
            SilverlightFaultMessageInspector inspector = new SilverlightFaultMessageInspector();
            endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
        }
        public class SilverlightFaultMessageInspector : IDispatchMessageInspector
        {
            public void BeforeSendReply(ref Message reply, object correlationState)
            {
                if (reply.IsFault)
                {
                    //ここはポイント
                    HttpResponseMessageProperty property = new HttpResponseMessageProperty();
                    property.StatusCode = System.Net.HttpStatusCode.OK;
                    reply.Properties[HttpResponseMessageProperty.Name] = property;
                }
            }

            public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
            {
                // Do nothing to the incoming message.
                return null;
            }
        }
        // The following methods are stubs and not relevant. 
        public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }
        public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
        }
        public void Validate(ServiceEndpoint endpoint)
        {
        }
        public override System.Type BehaviorType
        {
            get { return typeof(SilverlightFaultBehavior); }
        }
        protected override object CreateBehavior()
        {
            return new SilverlightFaultBehavior();
        }
    }
}


あなたのお住まいの地域で最安のブロードバンド選び

コメント:



(画像の文字列を入力して下さい)

トップ   編集 凍結 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019/12/02 (月) 12:47:29 (1628d)

e[NȂECir Yahoo yV LINEf[^[Ōz500~`I
z[y[W ̃NWbgJ[h COiq@COsیI COze