Silverlight反射によるWCF通信の作成
4812 ワード
反射メカニズムSilverlightクライアントとサービス側との通信をコードで簡単に説明します.
Sliverlightエンドページ
ヘルプクラス
ブラウザヘルプクラス:
注意:プログラミング中、siverlightはASPをサポートしていないため、サービスをアクティブにできません.NET互換性の問題は、以下のように具体的に説明されています.
スクリーンショット:
解決策:
対応するサービスを変更します.svc.cs
using System.ServiceModel.Activation ;
[AspNetCompatibilityRequirements (RequirementsMode=AspNetCompatibilityRequirementsMode.Required)]
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)]