Silverlight反射によるWCF通信の作成


反射メカニズムSilverlightクライアントとサービス側との通信をコードで簡単に説明します.
 
Sliverlightエンドページ
        /// 
        ///   WCF(  )      
        /// 
        private void LoadEventByWCFAsync()
        {
            //        (  :          )
            SupermapSLDemo.WCFService.EventBasicClient ebClient = (EventBasicClient)ServiceHelper.CreateServiceClient(typeof(SupermapSLDemo.WCFService.EventBasicClient));
            //              
            ebClient.GetEventForWCFCompleted += new EventHandler(client_GetEventCompleted);
            //ebClient.GetEventForWCFCompleted += client_GetEventCompleted; //       
            //        
            ebClient.GetEventForWCFAsync();
        }
        /// 
        ///       
         /// 
        /// 
        /// 
        void client_GetEventCompleted(object sender, SupermapSLDemo.WCFService.GetEventForWCFCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                dgEvent.ItemsSource = e.Result;
            }
        }

 
 
 
ヘルプクラス
using System;
using System.Reflection;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.Windows;

namespace HEMS.Common.Util
{
    public static class ServiceHelper
    {
        private const int MAXBUFFERSIZE = 2147483647;
        private const long MAXRECEIVEDMESSAGESIZE = 2147483647;

        /// 
        ///    Type ClientBase    
         /// 
        /// 
        /// 
        public static object CreateServiceClient(Type type)
        {
            //        
             object client = System.Activator.CreateInstance(type);
            //           
              foreach (PropertyInfo prInfo in type.GetProperties())
            {
                //  ServiceEndpoint     
                  if (prInfo.PropertyType == typeof(ServiceEndpoint))
                {
                    //    
                       object pValue = prInfo.GetValue(client, null);
                    //    
                       if (pValue != null)
                    {
                        //  ServiceEndpoint  
                            ServiceEndpoint endPt = (System.ServiceModel.Description.ServiceEndpoint)pValue;
                        BasicHttpBinding binding = new BasicHttpBinding();
                        binding.MaxBufferSize = ServiceHelper.MAXBUFFERSIZE;
                        binding.MaxReceivedMessageSize = ServiceHelper.MAXRECEIVEDMESSAGESIZE;

                        endPt.Binding = binding;
                        //  webservice        
                            string strUri = endPt.Address.Uri.AbsolutePath;
                        if (strUri.StartsWith("/"))
                        {
                            strUri = strUri.Substring(1);
                        }
                        EndpointAddress newepAddress = new EndpointAddress(BrowserHelper.GetCurrentHostPath() + strUri);
                        endPt.Address = newepAddress;
                    }
                }
            }
            return client;
        }
    }
}

 
ブラウザヘルプクラス:
using System;
using System.Windows.Browser;

namespace HEMS.Common.Util
{
    public static class BrowserHelper
    {
        public static string GetCurrentHostPath()
        {
            string rootUrl = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.HttpRequestUrl,
                                                                         UriFormat.UriEscaped);
            rootUrl = rootUrl.ToLower();
            if (rootUrl.EndsWith("default.aspx"))
            {
                rootUrl = rootUrl.Replace("default.aspx", "");
            }
            else
            {
                rootUrl = rootUrl.Substring(0, rootUrl.LastIndexOf('/'));
            }
            if (!rootUrl.EndsWith("/"))
            {
                rootUrl = rootUrl + @"/";
            }
            return rootUrl;
        }
    }
}

 
 
注意:プログラミング中、siverlightはASPをサポートしていないため、サービスをアクティブにできません.NET互換性の問題は、以下のように具体的に説明されています.

ASPはサポートされていないため、サービスをアクティブ化できません。NET互換性。このアプリケーションでASPが有効になっています。NET互換性。Webでお願いします。configでASPを閉じる.NET互換性モード、またはAspNetCompatibilityRequirementsプロパティをサービスタイプに追加し、RequirementsModeを「Allowed」または「Required」に設定します。


スクリーンショット:
 
解決策:
対応するサービスを変更します.svc.cs
using System.ServiceModel.Activation ;
[AspNetCompatibilityRequirements (RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]