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> 参考情報 ■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(); } } } あなたのお住まいの地域で最安のブロードバンド選び コメント: |