Web.config ASP.Net MVC

Di ASP.NET MVC Secara default ada 2 buah Web.Config

/Views/Web.config

Berisi directive-directive yang menginstruksikan ke server web untuk mengabaikan file-file aspx di folder Views. Selain hal itu, file ini juga berisi konfigurasi yang diperlukan untuk membuat kompiler ASP .NET berjalan dengan sip dengan sintak template View nya

/Web.config

File ini tempat konfigurasi aplikasi

Connection Strings

1. PHP, MySQL

mysql_connect(‘server’,’user’,’password’);
mysql_connect_db(‘database’);

2. Visual Studio 2010, MS SQL Server Express 2010

providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=xxx;Integrated Security=true;MultipleActiveResultSets=True;"

DbContext

Menggunakan DbContext dengan namespace yang berbeda dengan namespace Model, menghasilkan error berikut :

Type ‘Project.Data.Model’ could not be found. Make sure that the required schemas are loaded and that the namespaces are imported correctly. Near type name, line 1, column 74.

Masalah ini solve ketika namespace yang dipergunakan sama.

TransactionScope

Apabila terdapat lebih dari satu transaksi dijalankan , diperlukan kepastian semua transaksi berjalan sukses, apabila salah satu transaksi gagal, maka harus ada mekanisme untuk membatalkan transaksi yang telah dijalankan.
Snippet:

[HttpPost]
public ActionResult Create(User user)
{
if (ModelState.IsValid)
{
using (TransactionScope scope = new TransactionScope())
{
try
{
MembershipUser membership = Membership.CreateUser(user.Name, user.Password);
db.Users.Add(user);
db.SaveChanges();
//throw new Exception();
scope.Complete();
}
catch (MembershipCreateUserException ex)
{
string exceptionstring = ex.Message;
return View();
}
catch (EntityException ex)
{
string exceptionstring = ex.Message;
return View();
}
catch (Exception) { }
}
}
return RedirectToAction("Index");
}

Pada contoh di atas, transaksi pertama adalah insert user pada database bawaan System.WebSecurity.Membership, sedangkan transaksi kedua adalah insert user pada database aplikasi (custom). Test kode ini adalah dengan menambahkan Throw setelah transaksi pertama di eksekusi. Throw ini menyebabkan tranksaksi kedua tidak tereksekusi, sehingga otomatis scope.Complete tidak tereksekusi. Hasilnya transaksi pertama juga dibatalkan.

Concurrency Exception

Masalah Concurrency terjadi jika aplikasi kita di buka di beberapa browser, dan beberapa user berusaha mengupdate database pada field dan record yang sama secara bersama-sama pula. Seharusnya aplikasi mengantisipasi hal ini, karena menyebabkan data menjadi tidak konsisten.
Misalnya terdapat user A yang mengupdate data X pada suatu tempat, bersamaan dengan user B mengupdate data yang sama pada tempat yang berbeda secara bersama-sama. Ketika user A mengupdate data X menyadi data Y, maka user B belum mengetahui bahwa data X telah berubah menjadi data Y. Maka seharusnya dia tidak dapat mengupdate data tersebut, kecuali yang ditampilkan di layar sudah yang paling baru (data Y, bukan data X).
C# menggunakan DbUpdateConcurrencyException untuk menangkap eksepsi ini.
Snippet:

[HttpPost]
public ActionResult Edit(Product product)
{
try
{
if (ModelState.IsValid)
{
db.Entry(product).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
else
{
return RedirectToAction("Index");
}
}
catch (DbUpdateConcurrencyException ex)
{
var entry = ex.Entries.First();
var databaseValues = (Product)entry.GetDatabaseValues().ToObject();
var clientValues = (Product)entry.Entity;
if (databaseValues.Name != clientValues.Name)
{
ModelState.AddModelError("Name", "CurrentValue" + databaseValues.Name);
}
if (databaseValues.Price != clientValues.Price)
{
ModelState.AddModelError("Price", "CurrentValue" + databaseValues.Price);
}
ModelState.AddModelError(string.Empty, "Bla bla bla");
product.Timestamp = databaseValues.Timestamp;
}
catch (DataException de)
{
ModelState.AddModelError(string.Empty, "Unable to save changes");
}
ViewBag.InstructorID = new SelectList(db.Product, "ProductId", "Name", product.Id);
return View(product);
}

QuartzNet

Lingkungan :MS Visual Studio .Net 2010 (C#)

Instalasi
Instalasi dengan perintah install-package Quartz pada Nuget, install-package log4net, hal ini akan menambahkan Referensi Quartz dan log4net pada Solution.
Job
Buat sebuah folder untuk menyimpan Job, beri nama folder tersebut Job. Di dalam folder Job, buatlah sebuah Class baru, beri nama Job1 (file Job1.cs). Class Job1 harus mengimplementasi Interface IJob.

Interface Ijob memiliki satu method bernama Execute, yang bertipe void. Buat job dalam method ini, misalnya insert ke dalam database. Contoh:

Contoh:

using Quartz;
using QuartzSchedul.Models;
namespace QuartzSchedul.Job
{
public class Job1:IJob
{
public void Execute(JobExecutionContext context)
{
Tes tes1 = new Tes {  Name = "Tes1" };
DataContext dcontext = new DataContext();
dcontext.Tes.Add(tes1);
dcontext.SaveChanges();
}
}
}

Konfigurasi
Pada Web.Config, tambahkan key sebagai berikut:

<configuration>
<configSections>
<sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
<section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
<section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" />
</sectionGroup>
    <section name="quartz" type="System.Configuration.NameValuesSectionHandler, System, Version=1.0.5000.0, Culture=neutral, Public Key Token=b77a5c561934e089" />
    <sectionGroup name="common">
      <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
    </sectionGroup>
  </configSections>
  <quartz>
    <add key="quartz.scheduler.instanceName" value="QuartzScheduler" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPolicy" value="2" />
    <add key="quartz.jobStore.misfireThreshold" value="6000" />
    <add key="quartz.jobStore.type" value="Quartz.simpl.RAMJobStore,Quartz" />
  </quartz>
  <common>
    <logging>
      <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter,CommonLogging">
        <arg key="showLogName" value="true" />
        <arg key="showDataName" value="true" />
        <arg key="level" value="DEBUG" />
        <arg key="dateFormat" value="HH:mm:ss:fff" />
      </factoryAdapter>
    </logging>
  </common>
<add key=”job1” value=”5 * * * * ?”> dalam  <AppSettings>, sehingga kurang lebih menjadi seperti ini:
<configuration>
<appSettings>
<add key="webpages:Version" value="1.0.0.0"/>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
<add key="job1" value="1 * * * * ?" />
</appSettings>

Pada Global.asax, tambahkan scheduler dan daftarkan Job yang telah dibuat pada scheduler.

IScheduler scheduler = null;
ISchedulerFactory factory = new StdSchedulerFactory();
scheduler = factory.GetScheduler();
JobDetail job1 = new JobDetail("job1","jobGroup",typeof(Job1));
string cronjob1 = ConfigurationManager.AppSettings["job1"];
CronTrigger trigger = new CronTrigger("trigger", "triggerGroup", "job", "jobGroup", cronjob1);
scheduler.AddJob(job1,true);
scheduler.ScheduleJob(trigger);

Blackberry PAP push

PAP push allow you to send push message using Blackberry Internet Service. This service uses XML .

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

namespace pap_push
{
class push
{
public push(String param)
{
string pushId = “pushID:” + (new Random()).Next();
HttpWebResponse HttpWRes = null;
HttpWebRequest HttpWReq = null;
string pin = “2100000A”;
string BOUNDARY = “mPsbVQo0a68eIL3OAxnm”;
string msg = param;
string url = “http://localhost:8080/pap”;
HttpWReq = (HttpWebRequest)WebRequest.Create(url);
HttpWReq.Method = (“POST”);
HttpWReq.Accept = “text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2″;
HttpWReq.ContentType = “multipart/related; boundary=” + BOUNDARY + “;             type=application/xml”;
HttpWReq.Headers.Add(“x-Rim-Push-Dest-Port”, “100″);
HttpWReq.Headers.Add(“X-WAP-Application-id”, “/”);
StringBuilder dataToSend = new StringBuilder();
dataToSend.AppendLine(“–” + BOUNDARY);
dataToSend.AppendLine(“Content-Type: application/xml; charset=UTF-8″);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(“<?xml version=\”1.0\”?>”);
dataToSend.AppendLine(“<!DOCTYPE pap PUBLIC \”-//WAPFORUM//DTD PAP 2.0//EN\” “);
dataToSend.AppendLine(“\”http://www.wapforum.org/DTD/pap_2.0.dtd\” “);
dataToSend.AppendLine(“[<?wap-pap-ver supported-versions=\"2.0\"?>]>”);
dataToSend.AppendLine(“<pap>”);
string myPushId = DateTime.Now.ToFileTime().ToString();
dataToSend.AppendLine(“<push-message push-id=\”" + pushId + “\” ppg-notify-requested-to=\”http://localhost:7778\”>”);
dataToSend.AppendLine(“<address address-value=\”WAPPUSH=” + pin + “%3A100/TYPE=USER@rim.net\” />”);
dataToSend.AppendLine(“<quality-of-service delivery-method=\”confirmed\” />”);
dataToSend.AppendLine(“</push-message>”);
dataToSend.AppendLine(“</pap>”);
dataToSend.AppendLine(“–” + BOUNDARY);
dataToSend.AppendLine(“Content-Type: text/plain”);
//dataToSend.AppendLine(“Push-Message-ID: ” + pushId);
dataToSend.AppendLine(“”);
dataToSend.AppendLine(msg);
dataToSend.AppendLine(“–” + BOUNDARY + “–”);
dataToSend.AppendLine(“”);
Stream requestStream = null;
string pushResult = “”;
try { requestStream = HttpWReq.GetRequestStream(); }
catch (Exception ex)
{
pushResult = “Push failed! ” + ex.ToString();
}
byte[] outStr = new ASCIIEncoding().GetBytes(dataToSend.ToString());
requestStream.Write(outStr, 0, outStr.Length);
requestStream.Close();
try
{
HttpWRes = (HttpWebResponse)HttpWReq.GetResponse();
}
catch (Exception ex)
{            //push failed
}
if (HttpWRes != null)
{
HttpWRes.Close();
}
}
}
}

Your device should access the rim url (http://www.rim.com) before the application able to listen the push.

Blackberry RIM Push

With Blackberry RIM push, you send push message using html header request instead of XML. It can only used with Blackberry Enterprise Server

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;

namespace rim_push
{
class push
{
String _param;
byte[] data = null;
public push(String param)
{
_param = param;
}
public void httpPush(string BESAddress, string BESWebserverListenPort,
string pushTitle, string url, string pushPin)
{
string pushPort = “100″;
string httpURL = “http://”+ BESAddress +”:”+ BESWebserverListenPort +”/push?DESTINATION=”+ pushPin +”&PORT=”+ pushPort +”&REQUESTURI=/”;
try
{
HttpWebRequest HttpWReq = (HttpWebRequest)WebRequest.Create(httpURL);
HttpWReq.Method = (“POST”);
HttpWReq.Headers.Add(“Content-Location”, url);
HttpWReq.Headers.Add(“X-RIM-Push-Title”, pushTitle);
data = StrToByteArray(_param);
HttpWReq.ContentLength = data.Length;
Stream requestStream = HttpWReq.GetRequestStream();
requestStream.Write(data, 0, data.Length);
HttpWebResponse HttpWRes = (HttpWebResponse)HttpWReq.GetResponse();
requestStream.Close();
HttpWRes.Close();
}
catch (System.Exception e)
{
}
}
public static byte[] StrToByteArray(string str)
{
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
return encoding.GetBytes(str);
}
}
}

If you use a Blackberry simulator, you need an MDS running to see the result with Blackberry simulator

First add this code as listener to your button:

private void button1_Click(object sender, EventArgs e)
{
push push = new push(textBox1.Text);
push.httpPush(“localhost”, “8080″,  “x”, “localhost:8080″,”2100000A”);
}

make sure you can access localhost:8080 in your computer, thats mean your MDS is running. The default pin number is 2100000A, be sure the number is still the default.

Follow

Get every new post delivered to your Inbox.