‏نمایش پست‌ها با برچسب WCF. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب WCF. نمایش همه پست‌ها

۱۳۹۰/۰۱/۲۸

روش از كار انداختن صفحه‌ي Add service reference در VS.NET


در جهت تكميل بحث "بررسي امنيتي، حين استفاده از jQuery Ajax"، يك مورد ديگر را هم مي‌توان اضافه كرد: چگونه صفحه‌ي معروف Add service reference را در VS.NET جهت سرويس WCF خود از كار بيندازيم؟
راه حل آن هم بسيار ساده است اما چون عموما در منابع مرتبط با جملات و كلمات بيش از حد فني بيان مي‌شود، شايد از ديد دور مانده باشد:
اگر WCF Service توليدي شما تنها قرار است توسط برنامه‌ي Silverlight يا جاوا اسكريپتي موجود در پروژه‌ي جاري مورد استفاده قرار گيرد، بايد Meta Data مرتبط با آن سرويس را جهت بالابردن امنيت سيستم، حذف نمود. توسط اين Meta Data مي‌توان ServiceContract ، OperationContract و ساير اطلاعات يك WCF Service را استخراج نمود.

الف) روش غير فعال كردن متاديتا در يك Ajax enabled WCF Service

به فايل وب كانفيگ برنامه مراجعه كرده و تغيير زير را اعمال كنيد:
...
<behavior name="">
<serviceMetadata httpGetEnabled="false" httpsGetUrl="false" />
...
</behavior>
...

ب) روش غيرفعال كردن متاديتا در يك Silverlight enabled WCF Service

ابتدا قسمت الف را اعمال نموده سپس تغيير زير را نيز لحاظ نمائيد (IMetadataExchange به صورت كامنت درآمده):
<!-- <endpoint address="mex" binding="mexHttpBinding"
contract="IMetadataExchange" /> -->

با اين تغييرات ساده، گزينه‌ي Add service reference ديگر قابليت تشخيص خودكار اطلاعات سرويس شما را نداشته و با يك خطا متوقف خواهد شد:
The HTML document does not contain Web service discovery information.
Metadata contains a reference that cannot be resolved.

سؤال:
1- آيا با اين تغيير در عملكرد WCF سرويس ما اخلال ايجاد خواهد شد؟
پاسخ: خير. تنها Web service discovery information را از كار انداخته‌ايم.
2- در صورت تغيير كدهاي WCF Service چه بايد كرد؟
پاسخ: اگر امضاي متدها و اينترفيس‌هاي تعريف شده تغييري نداشته‌اند، لزومي به هيچ نوع تغييري نيست. در غيراينصورت، سريع موارد الف و ب فوق را به حالت اول برگردانده، كلاينت مورد استفاده را به روز كنيد، مجددا متاديتا را حذف نمائيد.

۱۳۸۹/۰۵/۲۰

يكپارچه كردن ELMAH با WCF RIA Services


پيشتر در مورد ELMAH مطلبي را منتشر كرده بودم و اگر برنامه نويس ASP.NET هستيد و با ELMAH آشنايي نداريد،‌ جدا نيمي از عمر كاري شما بر فنا است!
هاست پيش فرض يك WCF RIA Service هم يك برنامه‌ي ASP.NET است. بنابراين كليه‌ي خطاهاي رخ داده در سمت سرور را بايد بتوان به نحوي لاگ كرد تا بعدا با مطالعه‌ي آن‌ها اطلاعات ارزشمندي را از نقايص برنامه در عمل و پيش از گوشزد شدن آن‌ها توسط كاربران، دريافت، بررسي و رفع كرد.
كليه خطاها را لاگ مي‌كنم تا:
- بدانم معناي جمله‌ي "برنامه كار نمي‌كنه" چي هست.
- بدون روبرو شدن با كاربران يا حتي سؤال و جوابي از آن‌ها بدانم دقيقا مشكل از كجا ناشي شده.
- بدانم رفتارهاي عمومي كاربران كه منجر به بروز خطا مي‌شوند كدام‌ها هستند.
- بدانم در كداميك از قسمت‌هاي برنامه تعيين اعتبار ورودي كاربران يا انجام نشده يا ضعيف و ناكافي است.
- بدانم زمانيكه دوستي (!) قصد پايين آوردن برنامه را با تزريق SQL داشته، دقيقا چه چيزي را وارد كرده، در كجا و چه زماني؟
- بتوانم Remote worker خوبي باشم.

ELMAH هم براي لاگ كردن خطاهاي مديريت نشده‌ي يك برنامه‌ي ASP.NET ايجاد شده است. بنابراين بايد بتوان اين دو (WCF RIA Services و ELMAH) را به نحوي با هم سازگار كرد. براي اينكار نياز است تا يك مديريت كننده‌ي خطاي سفارشي را با پياده سازي اينترفيس IErrorHandler تهيه كنيم (تا خطاهاي مديريت نشده‌ي حاصل را به سمت ELMAH هدايت كند) و سپس آن‌را به كمك يك ويژگي يا Attribute به DomainService خود جهت لاگ كردن خطاها اعمال نمائيم. روش تعريف اين Attribute را در كدهاي بعد ملاحظه خواهيد نمود (در اينجا نياز است تا دو ارجاع را به اسمبلي‌هاي Elmah.dll كه دريافت كرده‌ايد و اسمبلي استاندارد System.ServiceModel نيز به پروژه اضافه نمائيد):

//add a reference to "Elmah.dll"
using System;
using System.ServiceModel.Channels;
using System.ServiceModel.Dispatcher;
using System.Web;

namespace ElmahWcf
{
public class HttpErrorHandler : IErrorHandler
{
#region IErrorHandler Members
public bool HandleError(Exception error)
{
return false;
}

public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
if (error == null)
return;

if (HttpContext.Current == null) //In case we run outside of IIS
return;

Elmah.ErrorSignal.FromCurrentContext().Raise(error);
}
#endregion
}
}

//add a ref to "System.ServiceModel" assembly
using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;

namespace ElmahWcf
{
public class ServiceErrorBehaviorAttribute : Attribute, IServiceBehavior
{
Type errorHandlerType;
public ServiceErrorBehaviorAttribute(Type errorHandlerType)
{
this.errorHandlerType = errorHandlerType;
}

#region IServiceBehavior Members

public void AddBindingParameters(
ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints,
BindingParameterCollection bindingParameters)
{ }

public void ApplyDispatchBehavior(
ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{
IErrorHandler errorHandler;
errorHandler = (IErrorHandler)Activator.CreateInstance(errorHandlerType);
foreach (ChannelDispatcherBase cdb in serviceHostBase.ChannelDispatchers)
{
ChannelDispatcher cd = cdb as ChannelDispatcher;
cd.ErrorHandlers.Add(errorHandler);
}
}

public void Validate(
ServiceDescription serviceDescription,
ServiceHostBase serviceHostBase)
{ }
#endregion
}
}
اكنون پس از تعريف ويژگي ServiceErrorBehavior، نوبت به اعمال آن مي‌رسد. به فايل DomainService خود مراجعه كرده و يك سطر زير را به آن اضافه نمائيد:
    [ServiceErrorBehavior(typeof(HttpErrorHandler))] //Integrating with ELMAH
[EnableClientAccess()]
public partial class MyDomainService : LinqToEntitiesDomainService<myEntities>

در ادامه نحوه‌ي افزودن تعاريف متناظر با ELMAH به Web.Config برنامه ذكر شده است. اين تعاريف براي IIS6 و 7 به بعد هم تكميل گرديده است. خطاها هم به صورت فايل‌هاي XML در پوشه‌اي به نام Errors كه به ريشه‌ي سايت اضافه خواهيد نمود (يا هر پوشه‌ي دلخواه ديگري)، لاگ مي‌شوند.
به نظر من اين روش، از ذخيره سازي اطلاعات لاگ‌ها در ديتابيس بهتر است. چون اساسا زمانيكه خطايي رخ مي‌دهد شايد مشكل اصلي همان ارتباط با ديتابيس باشد.
قسمت ارسال خطاها به صورت ايميل نيز comment شده است كه در صورت نياز مي‌توان آن‌را فعال نمود:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah"/>
<section name="errorTweet" requirePermission="false" type="Elmah.ErrorTweetSectionHandler, Elmah"/>
</sectionGroup>
</configSections>

<elmah>
<security allowRemoteAccess="1" />
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/Errors" />
<!-- <errorMail
from="errors@site.net"
to="nasiri@site.net"
subject="prj-error"
async="true"
smtpPort="25"
smtpServer="mail.site.net"
noYsod="true" /> -->
</elmah>

<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
<add name="DomainServiceModule"
preCondition="managedHandler"
type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
<handlers>
<add name="Elmah" verb="POST,GET,HEAD" path="myelmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</handlers>
</system.webServer>
<system.web>
<globalization
requestEncoding="utf-8"
responseEncoding="utf-8"
/>
<authentication mode="Forms">
<!--one month ticket-->
<forms name=".403AuthV"
cookieless="UseCookies"
slidingExpiration="true"
protection="All"
path="/"
timeout="43200" />
</authentication>
<httpHandlers>
<add verb="POST,GET,HEAD" path="myelmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
</httpHandlers>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
<add name="DomainServiceModule"
type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpModules>
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
<connectionStrings>
</connectionStrings>
<system.serviceModel>
<serviceHostingEnvironment
aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
</system.serviceModel>
</configuration>
اكنون براي مثال به يكي از متدهاي DomainService خود سطر زير را اضافه كرده و برنامه را آزمايش كنيد:
throw new Exception("This is an ELMAH test");

سپس به آدرس http://localhost/myelmah.axd مراجعه نموده و اطلاعات لاگ شده حاصل را بررسي كنيد:


اين روش با WCF Services هاي متداول هم كار مي‌كند. فقط در اين سرويس‌ها بايد aspNetCompatibilityEnabled مطابق تگ‌هاي ذكر شده‌ي system.serviceModel فوق در web.config لحاظ شوند (اين مورد به صورت پيش فرض در WCF RIA Services وجود دارد). همچنين ويژگي زير نيز بايد به سرويس شما اضافه گردد:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

منابع مورد استفاده:
Integrating ELMAH for a WCF Service
Making WCF and ELMAH play nice together
Getting ELMAH to work with WCF services



پ.ن.
اگر به خطاهاي ASP.NET دقت كرده باشيد كه به yellow screen of death هم مشهور هستند (در مقابل صفحات آبي ويندوز!)، ابتداي آن خيلي بزرگ نوشته شده Server Error و سپس ادامه‌ي خطا. همين مورد دقيقا يادم هست كه هر بار سبب بازخواست مديران شبكه بجاي برنامه نويس‌ها مي‌شد! (احتمالا اين هم يك نوع بدجنسي تيم ASP.NET براي گرفتن حال ادمين‌هاي شبكه است! و گرنه مثلا مي‌توانستند همان ابتدا بنويسند program/application error بجاي server error)

۱۳۸۹/۰۵/۱۶

يكسان سازي "ي" و "ك" دريافتي در حين استفاده از WCF RIA Services


يكي از مواردي كه در تمام برنامه‌هاي فارسي "بايد" رعايت شود (مهم نيست به چه زباني يا چه سكويي باشد يا چه بانك اطلاعاتي مورد استفاده است)، بحث اصلاح "ي" و "ك" دريافتي از كاربر و يكسان سازي آن‌ها مي‌باشد. به عبارتي برنامه‌ي فارسي كه اصلاح خودكار اين دو مورد را لحاظ نكرده باشد دير يا زود به مشكلات حادي برخورد خواهد كرد و "ناقص" است : اطلاعات بيشتر ؛ براي مثال شايد دوست نداشته باشيد كه دو كامران در سايت شما ثبت نام كرده باشند؛ يكي با ك فارسي و يكي با ك عربي! به علاوه همين كامران امروز مي‌تواند لاگين كند و فردا با يك كامپيوتر ديگر و صفحه كليدي ديگر پشت درب خواهد ماند. در حاليكه از ديد اين كامران، كلمه كامران همان كامران است!
بنابراين در دو قسمت "بايد" اين يكسان سازي صورت گيرد:
الف) پيش از ثبت اطلاعات در بانك اطلاعاتي (تا با دو كامران ثبت شده در بانك اطلاعاتي مواجه نشويد)
ب) پيش از جستجو (تا كامران روزي ديگر با صفحه كليدي ديگر بتواند به برنامه وارد شود)

راه حل يكسان سازي هم شايد به نظر اين باشد: رخداد فشرده شدن كليد را كنترل كنيد و سپس جايگزيني را انجام دهيد (مثلا ي عربي را با ي فارسي جايگزين كنيد). اين روش چند ايراد دارد:
الف) Silverlight به دلايل امنيتي اصلا چنين اجازه‌اي را به شما نمي‌دهد! (تا نتوان كليدي را جعل كرد)
ب) هميشه با يك TextBox ساده سر و كار نداريم. كنترل‌هاي ديگري هم هستند كه امكان ورود اطلاعات در آن‌ها وجود دارد و آن وقت بايد براي تمام آن‌ها كد نوشت. ظاهر كدهاي برنامه در اين حالت در حجم بالا، اصلا جالب نخواهد بود و ضمنا ممكن است يك يا چند مورد فراموش شوند.

راه بهتر اين است كه دقيقا حين ثبت اطلاعات يا جستجوي اطلاعات در لايه‌اي كه تمام ثبت‌ها يا اعمال كار با بانك اطلاعاتي برنامه به آنجا منتقل مي‌شود، كار يكسان سازي صورت گيرد. به اين صورت كار يكپارچه سازي يكبار بايد انجام شود اما تاثيرش را بر روي كل برنامه خواهد گذاشت، بدون اينكه هرجايي كه امكان ورود اطلاعات هست روال‌هاي رخداد گردان هم حضور داشته باشند.

در مورد ‌مقدمات WCF RIA Services كه درSilverlight و ASP.NET كاربرد دارد مي‌توانيد به اين مطلب مراجعه كنيد: +

جهت تكميل اين بحث متدي تهيه شده كه كار يكسان سازي ي و ك دريافتي از كاربر را حين ثبت توسط امكانات WCF RIA Services انجام مي‌دهد (دقيقا پيش از فراخواني متد SubmitChanges بايد بكارگرفته شود):


namespace SilverlightTests.RiaYeKe
{
public static class PersianHelper
{
public static string ApplyUnifiedYeKe(this string data)
{
if (string.IsNullOrEmpty(data)) return data;
return data.Replace("ی", "ي").Replace("ک", "ك");
}
}
}

using System.Linq;
using System.Windows.Controls;
using System.Reflection;
using System.ServiceModel.DomainServices.Client;

namespace SilverlightTests.RiaYeKe
{
public class RIAHelper
{
/// <summary>
/// يك دست سازي ي و ك در عبارات ثبت شده در بانك اطلاعاتي پيش از ورود به آن
/// اين متد بايد پيش از فراخواني متد
/// SubmitChanges
/// استفاده شود
/// </summary>
/// <param name="dds"></param>
public static void ApplyCorrectYeKe(DomainDataSource dds)
{
if (dds == null)
return;

if (dds.DataView.TotalItemCount <= 0)
return;

//پيدا كردن موجوديت‌هاي تغيير كرده
var changedEntities = dds.DomainContext.EntityContainer.GetChanges().Where(
c => c.EntityState == EntityState.Modified ||
c.EntityState == EntityState.New);

foreach (var entity in changedEntities)
{
//يافتن خواص اين موجوديت‌ها
var propertyInfos = entity.GetType().GetProperties(
BindingFlags.Public | BindingFlags.Instance
);

foreach (var propertyInfo in propertyInfos)
{
//اگر اين خاصيت رشته‌اي است ي و ك آن را استاندارد كن
if (propertyInfo.PropertyType != typeof (string)) continue;
var propName = propertyInfo.Name;
var val = new PropertyReflector().GetValue(entity, propName);
if (val == null) continue;
new PropertyReflector().SetValue(
entity,
propName,
val.ToString().ApplyUnifiedYeKe());
}
}
}
}
}

توضيحات:
از آنجائيكه حين فراخواني متد SubmitChanges فقط موجوديت‌هاي تغيير كرده جهت ثبت ارسال مي‌شوند، ابتدا اين موارد يافت شده و سپس خواص عمومي تك تك اين اشياء توسط عمليات Reflection بررسي مي‌گردند. اگر خاصيت مورد بررسي از نوع رشته‌اي بود، يكبار اين يك دست سازي اطلاعات ي و ك دريافتي صورت خواهد گرفت (و از آنجائيكه اين تعداد هميشه محدود است عمليات Reflection سربار خاصي نخواهد داشت).
اگر در كدهاي خود از DomainDataSource استفاده نمي‌كنيد باز هم تفاوتي نمي‌كند. متد ApplyCorrectYeKe را از قسمت DomainContext.EntityContainer به بعد دنبال كنيد.
اكنون تنها مورد باقيمانده بحث جستجو است كه با اعمال متد ApplyUnifiedYeKe به مقدار ورودي متد جستجوي خود، مشكل حل خواهد شد.

كلاس PropertyReflector بكارگرفته شده هم از اينجا به عاريت گرفته شد.
دريافت كدهاي اين بحث

۱۳۸۹/۰۳/۱۴

مقايسه‌اي كوتاه بين WCF و ASMX


ويژگي WCF ASMX
حداقل پيشنياز دات نت سه دات نت يك
هدف جايگزيني يكپارچه‌ي فناورهاي قبلي شامل
ASMX ، WSE ،
MSMQ ، COM+ Eenterprise
services
و .NET Remoting
ارائه وب سرويس
پروتكل‌هاي پشتيباني شده HTTP
TCP
Named pipes
MSMQ
Custom
UDP
HTTP only
پشتيباني از WS-* standards بلي خير
پشتيباني از اطلاعات بايناري بلي خير
پشتيباني از REST بلي خير
ميزبان‌هاي مهيا در هر نوع برنامه‌ي تهيه شده با دات 3 به بعد قابل
ميزباني است، مانند يك برنامه كنسول، يك سرويس ويندوز ان تي و غيره. به اين ليست IIS را هم مي‌توان اضافه كرد.
فقط IIS
سرعت WCF Services‌ نسبت به ASMX Web Services از 25
تا 50 درصد سریعتر هستند + و +

نحوه‌ي پاسخ دهي به درخواست‌ها (يا ايجاد يك وهله جديد) Singleton / private session / per call per-call
پشتيباني از تراكنش‌ها (transaction) پشتيباني تو كار + خير
امنيت پشتيباني تو كار + خودتان بايد فكري براي اين موضوع نمائيد.
بسط پذيري بلي + خير
مدت زمان يادگيري حداقل يك ماه يك روز!

۱۳۸۸/۰۷/۱۲

با رويه‌هاي ذخيره شده خود، وب سرويس ايجاد كنيد


قابليت جالبي از SQL Server 2005 به بعد به اين محصول اضافه شده است كه امكان ايجاد يك وب سرويس بومي را بر اساس رويه‌هاي ذخيره شده و يا توابع تعريف شده در ديتابيس‌هاي موجود، فراهم مي‌سازد. اين قابليت نيازي به IIS يا هر هاست ديگري براي اجرا ندارد و توسط خود اس كيوال سرور راه اندازي و مديريت مي‌شود.
توضيحات مفصل آن‌‌را در MSDN مي‌توانيد ملاحظه كنيد و در اينجا يك مثال عملي از آن را با هم مرور خواهيم كرد:

الف) ايجاد يك جدول آزمايشي به همراه تعدادي ركورد دلخواه در آن

CREATE TABLE [tblWSTest](
[id] [int] IDENTITY(1,1) NOT NULL,
[f1] [nvarchar](50) NULL,
[f2] [nvarchar](500) NULL,
CONSTRAINT [PK_tblWSTest] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

SET IDENTITY_INSERT [tblWSTest] ON
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (1, N'a1', N'a2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (2, N'b1', N'b2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (3, N'c1', N'c2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (4, N'd1', N'd2')
INSERT [tblWSTest] ([id], [f1], [f2]) VALUES (5, N'e1', N'e2')
SET IDENTITY_INSERT [dbo].[tblWSTest] OFF
ب) ايجاد يك رويه ذخيره شده در ديتابيس جاري

CREATE PROCEDURE GetAllData
AS
SELECT f1,
f2
FROM tblWSTest
ج) ايجاد يك HTTP Endpoint

CREATE ENDPOINT GetDataService
STATE = STARTED
AS HTTP(
PATH = '/GetData',
AUTHENTICATION = (INTEGRATED),
PORTS = (CLEAR),
CLEAR_PORT = 8080,
SITE = '*'
)
FOR SOAP(
WEBMETHOD 'GetAllData'
(NAME = 'testdb2009.dbo.GetAllData'),
WSDL = DEFAULT,
DATABASE = 'testdb2009',
NAMESPACE = DEFAULT
)

توضيحات:
Ports در حالت clear و يا ssl مي‌تواند باشد. همچنين براي اينكه با IIS موجود بر روي سيستم هم تداخل نكند CLEAR_PORT به 8080 تنظيم شده است. ساير پارامترهاي آن بسيار واضح هستند. براي مثال تعيين ديتابيسي كه اين رويه ذخيره شده در آن قرار دارد و همچنين مسير كامل دسترسي به آن دقيقا مشخص مي‌گردند.


اين وب سرويس هم اكنون آغاز به كار كرده است. براي مشاهده wsdl آن، آدرس زير را در مرورگر وب خود وارد نمائيد (PATH و CLEAR_PORT معرفي شده در endPoint اينجا بكار مي‌رود):

http://localhost:8080/GetData?wsdl

د) استفاده از اين وب سرويس در يك برنامه ويندوزي
يك برنامه ساده winForms را شروع كنيد. سپس يك DataGridView را بر روي فرم قرار دهيد (بديهي است اين مورد مي‌تواند يك برنامه ASP.Net هم باشد و موارد مشابه ديگر). سپس از منوي پروژه، يك service reference را در VS2008 بر اساس آدرس wdsl فوق اضافه كنيد (شكل زير):


براي اينكه اين مثال در VS2008 درست كار كند بايد فايل app.config ايجاد شده را كمي ويرايش كرد. قسمت security آن را يافته و تغييرات زير را با توجه به AUTHENTICATION مورد نياز تغيير دهيد:

<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
سپس كد برنامه ما به صورت زير خواهد بود:

using System;
using System.Data;
using System.Windows.Forms;

namespace WebServiceTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ServiceReference1.GetDataServiceSoapClient data =
new ServiceReference1.GetDataServiceSoapClient();
dataGridView1.DataSource = (data.GetAllData()[0] as DataSet).Tables[0];
}
}
}




۱۳۸۸/۰۳/۱۶

ويديوهاي رايگان WCF مخصوص توسعه دهندگان WPF


اخيرا يك سري ويديوي رايگان در سايت codePlex در زمينه WCF منتشر شده‌اند كه از آدرس زير قابل دريافت هستند:




اين ويديوها هر از چندگاهي نيز به روز شده و اضافه مي‌شوند. بنابراين اگر به اين مبحث علاقمنديد، مي‌توانيد مشترك فيد RSS آن پروژه در CodePlex شويد.


۱۳۸۸/۰۱/۰۵

Building WCF REST Services


ويديوي رايگاني در مورد پياده سازي WCF Services با استفاده از اصول REST ، ويژگي‌هاي WebGet و WebInvoke، كار با كلاس‌هاي SyndicationFeed و Rss20FeedFormatter و هاست آن در IIS .

ماخذ