ایجاد سرویس چندلایهی WCF با Entity Framework در قالب پروژه - 9
نویسنده: حامد قنادی
تاریخ: ۱۳۹۲/۱۱/۰۱ ۲۲:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
روی tblNews کلیک کرده آنرا بکشید و روی فرم رها کنید. آنگاه ظاهر فرم و چیدمان کنترلها را تنظیم کنید و دو دکمه ذخیره و لغو برابر با شکل در فرم ایجاد کنید:
کد رویداد دو دکمه را اینگونه بنویسید:
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}
private void btnSave_Click(object sender, EventArgs e)
{
this.DialogResult = System.Windows.Forms.DialogResult.OK;
} در پایین فرم روی tblNewsBindingSource کلیک کنید و از قسمت Properties ویژگی Modifiers آنرا برابر با Public کنید.
روی Combobox کلیک کنید، سپس ویژگی DataBinding -> Text آنرا خالی کنید. سپس روی فلش بالای Combobox دسته خبر کلیک کنید و تنظیمات آنرا مانند شکل زیر انجام دهید.
برای پرشدن آن کد زیر را در رویداد Load فرم اینگونه بنویسید:
private void frmAddEditNews_Load(object sender, EventArgs e)
{
MyNewsService.MyNewsServiceClient MyNews = new MyNewsService.MyNewsServiceClient();
tblCategoryIdComboBox.DataSource = MyNews.GetAllCategory();
} به فرم اصلی بازگردید و برای رویداد دکمهی ویرایش چنین بنویسید:
private void btnEdit_Click(object sender, EventArgs e)
{
if (tblNewsDataGridView.CurrentRow == null)
{
MessageBox.Show("سطری برای ویرایش انتخاب کنید");
}
else
{
//tblNews news = tblNewsDataGridView.CurrentRow.DataBoundItem as tblNews;
tblNews news = MyNews.GetNews(Convert.ToInt32(tblNewsDataGridView.CurrentRow.Cells["tblNewsId"].Value));
frmAddEditNews frmAdd = new frmAddEditNews();
frmAdd.tblNewsBindingSource.DataSource = news;
if (frmAdd.ShowDialog() == DialogResult.OK)
{
MyNews.EditNews(news);
tblNewsBindingSource.DataSource = MyNews.GetAllNews().Select(p => new { p.tblNewsId, p.tblCategory.CatName, p.Title, p.Description, RegDate = MiladiToShamsi(p.RegDate) });
}
}
} در صورتی که متد GetAllNews را به صورت ساده به ویژگی DataSource دیتاگرید نسبت داده بودیم میتوانستید از کد زیر برای مقداردهی به متغیر news بهره ببریم. ولی در حال حاضر این خط کد پیغام خطا میدهد. البته راههای دیگری برای حل این مشکل وجود دارد که در این درس قصد پرداختن به آنرا ندارم.
tblNews news = tblNewsDataGridView.CurrentRow.DataBoundItem as tblNews;
کد مربوط به رویداد دکمهی افزودن و حذف را نیز به صورت زیر بنویسید:
private void btnAdd_Click(object sender, EventArgs e)
{
tblNews news = new tblNews();
frmAddEditNews frmAdd = new frmAddEditNews();
frmAdd.tblNewsBindingSource.DataSource = news;
if (frmAdd.ShowDialog() == DialogResult.OK)
{
MyNews.AddNews(news);
tblNewsBindingSource.DataSource = MyNews.GetAllNews().Select(p => new { p.tblNewsId, p.tblCategory.CatName, p.Title, p.Description, RegDate = MiladiToShamsi(p.RegDate) });
}
}
private void btnRemove_Click(object sender, EventArgs e)
{
if (MessageBox.Show("آیا با حذف این سطر اطمینان دارید؟","هشدار",MessageBoxButtons.YesNo) == System.Windows.Forms.DialogResult.Yes)
{
MyNews.DeleteNews(Convert.ToInt32(tblNewsDataGridView.CurrentRow.Cells["tblNewsId"].Value));
tblNewsBindingSource.DataSource = MyNews.GetAllNews().Select(p => new { p.tblNewsId, p.tblCategory.CatName, p.Title, p.Description, RegDate = MiladiToShamsi(p.RegDate) });
}
} برنامه را اجرا کنید. کار ما کم و بیش به پایان رسیده است. شما یک پروژهی ویندوز ساده با استفاده از WCF ای که از Entity Framework برای اتصال به پایگاه داده بهره میبرد؛ ایجاد کردید. WCF بسیار گستردهتر از این است و در اینجا تنها به بخشی از آن پرداختیم. احتمالاً در صورت استقبال خوانندگان در آینده دربارهی تنظیمات ریز WCF برای امنیت، سرعت، محدودیت و استفاده در محیطهای مختلف خواهم نوشت.
شاد و پیروز باشید.
The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IMyNewsService" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:4636/SedaService.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IMyNewsService" contract="MyNewsService.IMyNewsService"
name="BasicHttpBinding_IMyNewsService" />
</client>
</system.serviceModel>
</configuration> <bindings>
<basicHttpBinding>
<binding maxReceivedMessageSize="2147483647" name="BasicHttpBinding_IMyNewsService" />
</basicHttpBinding>
</bindings> HTTP Error 404.3 - Not Found The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map
Server Error in '/MyNewService' Application. Could not load type 'System.ServiceModel.Activation.HttpModule' from assembly 'System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.
خطای آخری رو که ارسال کردید اینجا توضیح داده شده: http://support.microsoft.com/kb/2015129
خلاصهاش اینکه باید دستور aspnet_regiis.exe /iru رو در خط فرمان اجرا کنید. محل قرارگیری برنامه aspnet_regiis.exe در پوشه ویندوز هست (فایلها رو جستجو کنید تا یافت بشه).
Everywhere the problem to this solution was mentioned as re-registering aspNet by using aspnet_regiis.exe. But this did not work for me. Though this is a valid solution (as explained beautifully here) but it did not work with Windows 8. For Windows 8 you need to Windows features and enable everything under ".Net Framework 3.5" and ".Net Framework 4.5 Advanced Services".