Reflection Examples [C#] Sunday, Feb 6 2011 

This example shows how to dynamically load assembly, how to create object instance, how to invoke method or how to get and set property value.

Create instance from assembly that is in your project References

The following examples create instances of DateTime class from the System assembly.

// create instance of class DateTime

DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime));

// create instance of DateTime, use constructor with parameters (year, month, day)

DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime),

new object[] { 2008, 7, 4 });

Create instance from dynamically loaded assembly

All the following examples try to access to sample class Calculator from Test.dll assembly. The calculator class can be defined like this.

namespace Test

{

public class Calculator

{

public Calculator() { … }

private double _number;

public double Number { get { … } set { … } }

public void Clear() { … }

private void DoClear() { … }

public double Add(double number) { … }

public static double Pi { … }

public static double GetPi() { … }

}

}

Examples of using reflection to load the Test.dll assembly, to create instance of the Calculator class and to access its members (public/private, instance/static).

[C#]

// dynamically load assembly from file Test.dll
Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll");

[C#]

// get type of class Calculator from just loaded assembly
Type calcType = testAssembly.GetType("Test.Calculator");

[C#]

// create instance of class Calculator
object calcInstance = Activator.CreateInstance(calcType);

[C#]

// get info about property: public double Number
PropertyInfo numberPropertyInfo = calcType.GetProperty("Number");

[C#]

// get value of property: public double Number
double value = (double)numberPropertyInfo.GetValue(calcInstance, null);

[C#]

// set value of property: public double Number
numberPropertyInfo.SetValue(calcInstance, 10.0, null);

[C#]

// get info about static property: public static double Pi
PropertyInfo piPropertyInfo = calcType.GetProperty("Pi");

[C#]

// get value of static property: public static double Pi
double piValue = (double)piPropertyInfo.GetValue(null, null);

[C#]

// invoke public instance method: public void Clear()
calcType.InvokeMember("Clear",
    BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
    null, calcInstance, null);

[C#]

// invoke private instance method: private void DoClear()
calcType.InvokeMember("DoClear",
    BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic,
    null, calcInstance, null);

[C#]

// invoke public instance method: public double Add(double number)
double value = (double)calcType.InvokeMember("Add",
    BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,
    null, calcInstance, new object[] { 20.0 });

[C#]

// invoke public static method: public static double GetPi()
double piValue = (double)calcType.InvokeMember("GetPi",
    BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public,
    null, null, null);

[C#]

// get value of private field: private double _number
double value = (double)calcType.InvokeMember("_number",
    BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
    null, calcInstance, null);

 

Advertisements

ASP.NET MVC and JSON Tuesday, Dec 21 2010 

In the AJAX community, JSON have become the preferred way of sending and receiving data. That’s not surprising since it’s lightweight, fast and easy to understand. Also, since it’s a subset of Javascript, it’s familiar territory for Javascript coders.

In the ASP.NET MVC Framework, passing JSON from the server to the client script is almost too easy. In this article I will walk you through the code required to make it work.

The back end

Suppose we have a class named Cars like the one below. We want to feed our web page with a list of cars that we want to display AJAX style, preferably by sending the list as a JSON object.

public class Car {

public string Name { get; set; }
public string Color { get; set; }
}

With the ASP.NET MVC Framework it’s a breeze. In your Controller you simply create a method of the type JsonResult which returns a JSON object. You then use the Json() method to transform the class to JSON.
public class CarsController : Controller

{
public JsonResult GetCars()
{
List<Car> cars = Cars.GetCars();
return this.Json(cars);
}
}

Calling this method will return JSON that looks something like this:

[{“Name”:”Saab”,”Color”:”Red”},{“Name”:”Volvo”,”Color”:”Blue”}]

Making the AJAX call

To get the list of cars on the client side, you want to make an AJAX call to the Controller method GetCars(). This is done by calling the URL /Cars/GetCars/.

First I’ll walk you through how to do it with pure Javascript. Then I’ll show you how to do it with the jQuery library.
The Classic Javascript way

First of all you have to create an instance of the XMLHttpRequest object. It’s through this object that you communicate with the back end. Since IE 6 doesn’t support this object but do have support for an ActiveX object that essentially does the same thing, we initially have to do some checking to make sure that we use the correct object. I’ve created a wrapper function that with the help of object detection determines which object to use and then returns it.function getRequestObject() {

var req = false;
if(window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if(window.ActiveXObject) {
req = new ActiveXObject(“Microsoft.XMLHTTP”);
}
return req;
}

I use the getRequestObject function to get the correct Request Object and then gets on with setting up the request.

var request = getRequestObject();

request.onreadystatechange = handleResponse;
request.open(‘GET’, ‘/Cars/GetCars’, true);
request.send(null);

Note: If you’re unfamiliar with AJAX and find this code really strange, I recommend that you read getting started with AJAX from Mozilla Developer Center.

Ok, so the AJAX Call is all set up. The last thing to do is to create the function handleResponse that takes care of the request and the received data.

function handleResponse() {

if (request.readyState == 4) {
var cars = eval(‘(‘ + request.responseText + ‘)’);

for each(car in cars) {
alert(car.Name + ‘, ‘ + car.Color);
}
}
}

The object is received as JSON text through the responseText property of the request object. To convert it to a JSON object you can use the Eval() function. It will parse the text and produce an object structure. This is a fast and convenient way of doing it, but be aware of that it has potential security issues. Only use it if you know that you can trust the source. Otherwise you should use a more robust JSON parser.

The code in this example will throw an alert for each item in the JSON object and display it’s properties. This is done by looping through the received object. Notice how we can access the properties of the object through convenient dot notation.
The jQuery way

The client side scripting is even easier using jQuery. All the Javascript code above can be replaced with this.

$.getJSON(“/Cars/GetCars”, null, function(data) {

$.each(data, function(index, car) {
alert(car.Name, car.Color)
});
});

jQuery handles everything that happens in the background, like instantiating the request object and parsing the received JSON object. So it does all the heavy lifting and leaves the fun stuff to you, like doing creative things with the received data.

 

Reference: http://www.ajaxprojects.com/ajax/tutorialdetails.php?itemid=399

 

Removing Duplicates from a List in C# Friday, Dec 3 2010 

When you are dealing with a list of data, you may be interested in filtering out all duplicate values. For example, let’s say your input resembles the following:

input = { there, here, deer, dear, there, pier, deer, leer }

Your output with duplicates removed would be:

input = { there, here, near, deer, dear, pier leer }

The duplicate there‘s and deer‘s were removed. In this tutorial, I will provide the code for removing duplicates and then explain how the code actually works to efficiently remove duplicate elements.

The Code
The code for removing duplicate values is:

static List<string> removeDuplicates(List<string> inputList)
{
Dictionary<string, int> uniqueStore = new Dictionary<string, int>();
List<string> finalList = new List<string>();
foreach (string currValue in inputList)
{
if (!uniqueStore.ContainsKey(currValue))
{
uniqueStore.Add(currValue, 0);
finalList.Add(currValue);
}
}
return finalList;
}

Note that the above code is designed for Lists that store string data, but you can modify the code easily to accept any type of data! Don’t worry – I will explain later.

How to Use the Code
To test the above code, all you need is a List that contains duplicate values. You can copy and paste the following main method to see for yourself:

static void Main(string[] args)
{
List<string> input = new List<string>();
input.Add(“There”);
input.Add(“Here”);
input.Add(“Sneer”);
input.Add(“There”);
input.Add(“Near”);
input.Add(“Meer”);
input.Add(“Here”);
List<string> result = removeDuplicates(input);
}

Reference: http://www.kirupa.com/net/removingDuplicates.htm

C Sharp 2010 Ebook (pdf) Free download Thursday, Nov 11 2010 

C Sharp 2010 Ebook Free download click here

The Attributes of a Connection String in ASP.Net with C# Thursday, Nov 11 2010 

To use a SqlConnection object, you must provide various pieces of information joined into a string but are separated from each other with a semi-colon “;”. Each piece appears as a Key=Value:

Key1=Value1;Key2=Value2;Key_n=Value_n

It can be passed as follows:

SqlConnection connection = new SqlConnection("Key1=Value1;Key2=Value2;Key_n=Value_n");

or assigned as a string to the SqlConnection.ConnectionString property:

string strConnection = "Key1=Value1;Key2=Value2;Key_n=Value_n";
SqlConnection connection = new SqlConnection();

connection.ConnectionString = strConnection;

The Source of Data

To establish a connection, you must specify the computer you are connecting to, that has Microsoft SQL  Server installed. If you are creating your application on the same computer on which SQL Server is  installed, you can use (local). Here is an example:
SqlConnection connection = new SqlConnection("Server=(local); ");

If you know the name of the computer, you can assign it to the computer attribute. Here is an example:

SqlConnection connection = new SqlConnection("Server=central; ");

In the same way, if you are connecting to a specific computer, you must provide its name. Here is an

example:

SqlConnection connection = new SqlConnection("Data Source=central; ")

Security

An important aspect of establishing a connection to a computer is security. To support security, the

connection string of the SqlConnection class includes an attribute called Trusted_Connection orIntegrated

Security that can have a value of truefalseyesno, or SSPI with the SSPI having the same indication

as true.

If you are establishing a trusted or simple connection that doesn't need to be verified, you can assign

a value of true or SSPI.  Here is an example:

SqlConnection connection =
        new SqlConnection("Server=(local);Trusted_Connection=SSPI");

If you are programmatically establishing the connection, to apply authentication, you can assignfalse or

no to the security attribute you selected.

The Username

To specify the user name, after assigning false or no to the security attribute, you must use theUser ID

attribute and assign it a valid username. Here is an example:

string strConnection = "Server=(local);" +
                           "Integrated Security=no;" +
                           "User ID=wmessmann";
    SqlConnection connection = new SqlConnection(strConnection);

The Password

Besides the username, to create a secured connection, you must also provide a password. To specify the

password, you can user either the PASSWORD or the PWD. Here is an example:

string strConnection = "Server=(local);" +
                           "Integrated Security=no;" +
                           "User ID=wmessmann;PWD=$outh~@kotA";
    SqlConnection connection = new SqlConnection(strConnection);

The Database

To specify the database, the connection string includes an attribute named Database. TheDatabase keyword

can also be substituted for the Initial Catalog value. Here is an example:

SqlConnection connection = new SqlConnection(Server=(local);Database=;);

Another alternative is to assign an empty, single-quoted, string to this attribute. Here is an example:

void InitializeComponent()
{
    string strConnection = "Server=(local);Initial Catalog='exercise1';";
    SqlConnection connection = new SqlConnection(strConnection);
}

As mentioned above, the Database attribute is optional, especially if you are only connecting to the

computer and not to a specific database.

Additional Attributes

There are various other attributes used in the connection string. They include Network Library(also

called Net), Application NameWorkstation IDEncryptConnection TimeoutData SourcePacket Size,

AttachDBFilenameCurrent LanguagePersist Security Info.

After creating the connection string, when the application executes, the compiler would "scan" the string

to validate each key=value section. If it finds an unknown Key, an unknown value, or an invalid

combination of key=value, it would throw an ArgumentException exception and the connection cannot be

established.
Reference: http://www.functionx.com/aspnet/sqlserver/Lesson01.htm
 

How and what is the use of a abstract class constructor? Wednesday, Nov 10 2010 

As we know a abstract class can not be instantiated.

But sometimes we need to call a constructor of abstract class. An abstract class may have constructors to initialize methods or pass values along to base class constructors.

 

 

Example:

 

using System;
public class HelloWorld
{
public static void Main()
{
Person hs = new Person(“Hitesh”,“Seth”);
Console.WriteLine(hs.GetFullName());
}
}
abstract public class Abstract
{
protected string FirstName, LastName;
public Abstract(string FirstName, string LastName)
{
this.FirstName = FirstName;
this.LastName = LastName;
}
abstract public string GetFullName();
}
public class Person : Abstract
{
public Person(string FirstName, string LastName) : base(FirstName, LastName)
{
}
public override string GetFullName()
{
return FirstName+“.”+LastName;
}
}

 


How to read an Excel file in C# Thursday, Oct 21 2010 

From the following section you can see How to find the last row data in Excel worksheet or How to find the Used area in an Excel worksheet from C#.

The following C# source code using Microsoft Excel 12.0 Object Library for reading an Excel file. In the previous section we saw how to import Microsoft Excel 12.0 Object Library in the CSharp project .

Create Excel file from CSharp

For reading entire content of an Excel file in C#, we have to know how many cells used in the Excel file. In order to find the used range we use “UsedRange” property of xlWorkSheet . It will return the last cell of used area.

Excel.Range range ;

range = xlWorkSheet.UsedRange;

using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel; 

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

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp ;
            Excel.Workbook xlWorkBook ;
            Excel.Worksheet xlWorkSheet ;
            Excel.Range range ;

            string str;
            int rCnt = 0;
            int cCnt = 0;

            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Open("csharp.net-informations.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;

            for (rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
            {
                for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
                {
                    str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2 ;
                    MessageBox.Show(str);
                }
            }

            xlWorkBook.Close(true, null, null);
            xlApp.Quit();

            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);
        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        } 

    }
}
When you execute this C# source code the program read all used cells from Excel file.

reference: http://csharp.net-informations.com/excel/csharp-read-excel.htm


 

How to create Excel file in C# Thursday, Oct 21 2010 

The following section explains how to create an Excel file programmatically using C#.

Before you create an Excel file in C# , you have to add the Microsoft Excel 12.0 Object Library to you project.

Create a new project and add a Command Button to the Form.

Form the following pictures you can find how to add Excel reference library in your project.

Select reference dialogue from Project menu

scsharp-excel-reference

Select Microsoft Excel 12.0 Object Library and click OK button

csharp-excel-library

Copy and paste the following source code in your C# project file.

 

using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel; 

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

        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp ;
            Excel.Workbook xlWorkBook ;
            Excel.Worksheet xlWorkSheet ;
            object misValue = System.Reflection.Missing.Value;

            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Add(misValue);

            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
            xlWorkSheet.Cells[1, 1] = "http://csharp.net-informations.com";

            xlWorkBook.SaveAs("csharp-Excel.xls", Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
            xlWorkBook.Close(true, misValue, misValue);
            xlApp.Quit();

            releaseObject(xlWorkSheet);
            releaseObject(xlWorkBook);
            releaseObject(xlApp);

            MessageBox.Show("Excel file created , you can find the file c:\\csharp-Excel.xls");
        }

        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Exception Occured while releasing object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
    }
}
Note : You have to add Microsoft.Office.Interop.Excel to your source code. 
using Excel = Microsoft.Office.Interop.Excel; 

When you execute this program , it will create an excel file in you c:

Reference: http://csharp.net-informations.com/excel/csharp-create-excel.htm

 

 

How to find IP Adress Thursday, Oct 21 2010 

Network programming in console/windows is possible with sockets . C# simplifies network programming through its namespaces like System.Net and System.Net.Sockets .

The System.Net classes provide functionalities that is similar to Microsoft WinInet API. The System.net namespace provides the information about IP Address . The following C# program shows how to find the IP Address of a host.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
namespace GetIPAddressDemo2
{
class Program
{
static void Main(string[] args)
{
Console.Write(“Enter Host name(e.g. http://www.google.com): “);
string host = Console.ReadLine();
try
{
IPHostEntry hostname = Dns.GetHostEntry(host);
IPAddress[] ip = hostname.AddressList;
Console.WriteLine(“\nIP Address is ” + ip[0].ToString());
Console.ReadKey();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
}

Reference: http://csharp.net-informations.com/communications/csharp-ip-address.htm

Calling Cross Domain Web Services in AJAX Wednesday, Oct 13 2010 

One of the current vogues in web applications is the creation of mashups. This involves the marrying of content and/or functionality from two different sources. Over the last few years, the opening up of formerly proprietary APIs from the likes of Google, Yahoo, Last.fm, Flickr, YouTube and Amazon has allowed developers to implement in their own applications, with simple one line calls to the requisite APIs, features such as adding photos, maps, booklists, videos and playlists.

The APIs allow the developer to select content through a series of filters such as location, date, user id, or membership of a particular group. The APIs are almost always thinly disguised wrappers for a web service.

With a lot of modern applications now employing Ajax techniques (with indeed whole web sites such ashttp://ajaxpatterns.org/ dedicated to Ajax patterns, and http://www.programmableweb.com/ dedicated to mashup applications which utilize a lot of Ajax techniques), it makes sense to call the web services from within your own JavaScript. However, there is one big hitch to this theory. The XMLHttpRequest object is prevented from calling web services from outside its own domain. This is sensible given that if you called a script in one place and it, in turn, called a script on another server, it could leave an applicationopen to all sorts of malicious scripts, hacks and exploits.

However in the case of web services, it isn’t so sensible. Web services are called with either SOAP or HTTP-GET/POST requests and return information in the same way. They are designed to be called from other domains, and in some ways it’s an inherent contradiction to prevent them being called this way. So, given that there are plenty of mashups out there, and plenty of applications developed calling cross-domain web services, what do developers do to get around this limitation?

There isn’t a single answer to this question, but in this article I’ll discuss the current most popular techniques and what several developers are proposing to do get around this problem more neatly.

The XMLHttpRequest object

At the heart of the problem lies the XMLHttpRequest object. This object is central to many Ajax applications, although not an essential feature. The XMLHttpRequest object was introduced to IE5 as an ActiveX control, although the original version was conceived in Outlook Web Access 2000. This was an Outlook web-mail service that allowed people to access functionality such as download email, check calendars, and update contacts on the go, by allowing the application to issue its own client-side HTTP requests. It was introduced as a native object to Mozilla for release 1.0 and ended up in Safari 1.2 and Opera 7.60.

The XMLHttpRequest object doesn’t allow calls to be made from code in one domain to a web service in another. The latest craze for mashups involves calling Web Services from APIs made publicly available by companies such as Google, Flickr, Yahoo, Last.fm and YouTube. This means that a call will always have to be made cross-domain, otherwise you can’t use them. The best way to illustrate the problem is to build an example.

The currency converter example

In the example the application calls the freely available currency conversion services from webservicex.net. There are two drop down lists containing the list of currencies. So for example, you can select US Dollar in the first and Great British Pound Sterling in the second and then click on a button, to get the current rate. When the button is click, JavaScript is used to call the web service. The result is returned to the XMLHttpRequest object and ultimately rendered in the page.

Our application must have at least two sections, the first is the HTML page and the second is the script that calls the service. Our default.htm page is as follows:

<%@ Page Language="C#" AutoEventWireup="true"
                        CodeFile="Default.aspx.cs" Inherits="_Default" %>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Ajax Currency Convertor</title>
<script type="text/javascript" src="Ajax.js"></script>
</head>
<body>
Currency To Convert From:
<select id="FromBox">
<option value="USD" selected="true">USD - U.S. Dollar</option>
<option value="GBP">GBP - British Pound</option>
<option value="EUR">EUR - Euro</option>
<option value="JPY">JPY - Japanese Yen</option>
</select>
Currency To Convert To:
<select id="ToBox">
<option value="USD">USD - U.S. Dollar</option>
<option value="GBP" selected="true">GBP - British Pound</option>
<option value="EUR">EUR - Euro</option>
<option value="JPY">JPY - Japanese Yen</option>
</select>
<br /><br />
<input id="button1" type="button" value="Click to convert currency"
           onclick="initiateConversion()" />
<br /><br />
<table id="table1">
</table>
</body>
</html>

Ajax.js:

sasasfunction initiateConversion()
{
xmlhttprequest = createRequestObject();
var url = “http://www.webservicex.net/CurrencyConvertor.asmx/
ConversionRate?FromCurrency=?FromCurrency=”
+ document.getElementById(“FromBox”).value
+ “&ToCurrency=”
+ document.getElementById(“ToBox”).value ;
xmlhttprequest.open(“GET”, url, true);
xmlhttprequest.onreadystatechange = getData;
xmlhttprequest.send(null);
}

function createRequestObject()
{
if (window.XMLHttpRequest)
{
return xmlhttprequest = new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
return xmlhttprequest = new ActiveXObject(“Microsoft.XMLHTTP”);
}
}
function getData()
{
if ((xmlhttprequest.readyState == 4) &&( xmlhttprequest.status == 200))
{
var myXml = xmlhttprequest.responseXML;
var xmlobject = null;
var XMLText = null;
if (window.ActiveXObject)
{
XMLText = myXml.childNodes[1].firstChild.nodeValue;
}
else
{
XMLText = myXml.childNodes[0].firstChild.nodeValue;
}

var table = document.getElementById(“table1”);
var row = table.insertRow(table.rows.length);
var tablecell = row.insertCell(row.cells.length);
tablecell.appendChild(document.createTextNode
(document.getElementById(“FromBox”).value
+ ” to ”
+ document.getElementById(“ToBox”).value));
var tablecell = row.insertCell(row.cells.length);
tablecell.appendChild(document.createTextNode(XMLText));
table.setAttribute(“border”, “2”);
}
}

calcService.aspx:

<%@Page Language = “C#” Debug=”true” %>

<%@ import Namespace=”System.Xml” %>

<script language=”C#” runat=”server”>

void Page_Load()

{

XmlDocument wsResponse = new XmlDocument();

string url = “http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=&#8221; + Request.QueryString[“FromBox”].ToString() + “&ToCurrency=” + Request.QueryString[“ToBox”].ToString();        wsResponse.Load(url);

string XMLDocument = wsResponse.InnerXml;

Response.ContentType = “text/xml”;

Response.Write(XMLDocument);

}

</script>

For complete reference: http://www.simple-talk.com/dotnet/asp.net/calling-cross-domain-web-services-in-ajax/

 

 

Next Page »