<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://bloggingabout.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results matching tags 'Web Services', 'jQuery', 'JSONP', 'JSON', and 'JavaScript'</title><link>http://bloggingabout.net/search/SearchResults.aspx?a=1&amp;o=DateDescending&amp;tag=Web+Services,jQuery,JSONP,JSON,JavaScript&amp;orTags=0</link><description>Search results matching tags 'Web Services', 'jQuery', 'JSONP', 'JSON', and 'JavaScript'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Cross-domain JSONP with jQuery call step-by-step guide</title><link>http://bloggingabout.net/blogs/adelkhalil/archive/2009/08/14/cross-domain-jsonp-with-jquery-call-step-by-step-guide.aspx</link><pubDate>Thu, 13 Aug 2009 22:36:45 GMT</pubDate><guid isPermaLink="false">813b6dfd-644e-4573-a816-eebab56ba0d0:482056</guid><dc:creator>Adel Khalil</dc:creator><description>&lt;p&gt;I’ve been banging my head all day to accomplish this, it’s like a puzzle.. but since i get it to work i thought i could write this post for you and myself.&lt;/p&gt;  &lt;h2&gt;What we want to accomplish?&lt;/h2&gt;  &lt;p&gt;Simple way to communicate cross-domain with ASMX .NET 3.5 Web Service&lt;/p&gt;  &lt;h2&gt;How can we do it?&lt;/h2&gt;  &lt;h3&gt;1. Implement a web service method like the following&lt;/h3&gt;  &lt;pre class="code"&gt;   [&lt;span style="color:#2b91af;"&gt;ScriptService&lt;/span&gt;]
   &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;JSONP_EndPoint &lt;/span&gt;: System.Web.Services.&lt;span style="color:#2b91af;"&gt;WebService
   &lt;/span&gt;{
       [&lt;span style="color:#2b91af;"&gt;WebMethod&lt;/span&gt;]
       [&lt;span style="color:#2b91af;"&gt;ScriptMethod&lt;/span&gt;(UseHttpGet = &lt;span style="color:blue;"&gt;true&lt;/span&gt;,ResponseFormat = &lt;span style="color:#2b91af;"&gt;ResponseFormat&lt;/span&gt;.Json)]
       &lt;span style="color:blue;"&gt;public string &lt;/span&gt;Sum(&lt;span style="color:blue;"&gt;string &lt;/span&gt;x,&lt;span style="color:blue;"&gt;string &lt;/span&gt;y)
       {
           &lt;span style="color:blue;"&gt;return &lt;/span&gt;x + y;&lt;span style="color:green;"&gt;
       &lt;/span&gt;}
   }&lt;/pre&gt;
&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;

&lt;h3&gt;2. Add New class library with a name ContentTypeHttpModule&lt;/h3&gt;

&lt;p&gt;The reason for this is no matter how you specify the content-type of your ajax call ASP.NET send the request with Content-Type text/xml; charset=utf-8 this is &lt;a href="http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx"&gt;security feature explained here by ScottGu&lt;/a&gt;&amp;#160;&lt;/p&gt;

&lt;h3&gt;3. Add the following code to your Class (&lt;a href="http://elegantcode.com/2008/12/02/calling-remote-aspnet-web-services-from-jquery/"&gt;Code by Jason&lt;/a&gt; i just did a simple modification)&lt;/h3&gt;

&lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;using &lt;/span&gt;System;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.IO;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Linq;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Text;
&lt;span style="color:blue;"&gt;using &lt;/span&gt;System.Web;

&lt;span style="color:blue;"&gt;namespace &lt;/span&gt;ContentTypeHttpModule
{
    &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ContentTypeHttpModule &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;IHttpModule
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;private const string &lt;/span&gt;JSON_CONTENT_TYPE = &lt;span style="color:#a31515;"&gt;&amp;quot;application/json; charset=utf-8&amp;quot;&lt;/span&gt;;

        &lt;span style="color:blue;"&gt;#region &lt;/span&gt;IHttpModule Members
        &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Dispose()
        {
        }

        &lt;span style="color:blue;"&gt;public void &lt;/span&gt;Init(&lt;span style="color:#2b91af;"&gt;HttpApplication &lt;/span&gt;app)
        {
            app.BeginRequest += OnBeginRequest;
            app.ReleaseRequestState += OnReleaseRequestState;
        }
        &lt;span style="color:blue;"&gt;#endregion

        public void &lt;/span&gt;OnBeginRequest(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
        {
            &lt;span style="color:#2b91af;"&gt;HttpApplication &lt;/span&gt;app = (&lt;span style="color:#2b91af;"&gt;HttpApplication&lt;/span&gt;)sender;
            &lt;span style="color:#2b91af;"&gt;HttpRequest &lt;/span&gt;resquest = app.Request;
            &lt;span style="color:blue;"&gt;if &lt;/span&gt;(!resquest.Url.AbsolutePath.Contains(&lt;span style="color:#a31515;"&gt;&amp;quot;JSONP-EndPoint.asmx&amp;quot;&lt;/span&gt;)) &lt;span style="color:blue;"&gt;return&lt;/span&gt;;

            &lt;span style="color:blue;"&gt;if &lt;/span&gt;(&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(app.Context.Request.ContentType))
            {
                app.Context.Request.ContentType = JSON_CONTENT_TYPE;
            }
        }

        &lt;span style="color:blue;"&gt;public void &lt;/span&gt;OnReleaseRequestState(&lt;span style="color:blue;"&gt;object &lt;/span&gt;sender, &lt;span style="color:#2b91af;"&gt;EventArgs &lt;/span&gt;e)
        {
            &lt;span style="color:#2b91af;"&gt;HttpApplication &lt;/span&gt;app = (&lt;span style="color:#2b91af;"&gt;HttpApplication&lt;/span&gt;)sender;
            &lt;span style="color:#2b91af;"&gt;HttpResponse &lt;/span&gt;response = app.Response;
            &lt;span style="color:blue;"&gt;if &lt;/span&gt;(app.Context.Request.ContentType != JSON_CONTENT_TYPE) &lt;span style="color:blue;"&gt;return&lt;/span&gt;;

            response.Filter = &lt;span style="color:blue;"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;JsonResponseFilter&lt;/span&gt;(response.Filter);
        }
    }

    &lt;span style="color:blue;"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;JsonResponseFilter &lt;/span&gt;: &lt;span style="color:#2b91af;"&gt;Stream
    &lt;/span&gt;{
        &lt;span style="color:blue;"&gt;private readonly &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;Stream &lt;/span&gt;_responseStream;
        &lt;span style="color:blue;"&gt;private long &lt;/span&gt;_position;

        &lt;span style="color:blue;"&gt;public &lt;/span&gt;JsonResponseFilter(&lt;span style="color:#2b91af;"&gt;Stream &lt;/span&gt;responseStream)
        {
            _responseStream = responseStream;
        }

        &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;CanRead { &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return true&lt;/span&gt;; } }

        &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;CanSeek { &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return true&lt;/span&gt;; } }

        &lt;span style="color:blue;"&gt;public override bool &lt;/span&gt;CanWrite { &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return true&lt;/span&gt;; } }

        &lt;span style="color:blue;"&gt;public override long &lt;/span&gt;Length { &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;0; } }

        &lt;span style="color:blue;"&gt;public override long &lt;/span&gt;Position { &lt;span style="color:blue;"&gt;get &lt;/span&gt;{ &lt;span style="color:blue;"&gt;return &lt;/span&gt;_position; } &lt;span style="color:blue;"&gt;set &lt;/span&gt;{ _position = &lt;span style="color:blue;"&gt;value&lt;/span&gt;; } }

        &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Write(&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] buffer, &lt;span style="color:blue;"&gt;int &lt;/span&gt;offset, &lt;span style="color:blue;"&gt;int &lt;/span&gt;count)
        {
            &lt;span style="color:blue;"&gt;string &lt;/span&gt;strBuffer = &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetString(buffer, offset, count);
            strBuffer = AppendJsonpCallback(strBuffer, &lt;span style="color:#2b91af;"&gt;HttpContext&lt;/span&gt;.Current.Request);
            &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] data = &lt;span style="color:#2b91af;"&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(strBuffer);
            _responseStream.Write(data, 0, data.Length);
        }

        &lt;span style="color:blue;"&gt;private string &lt;/span&gt;AppendJsonpCallback(&lt;span style="color:blue;"&gt;string &lt;/span&gt;strBuffer, &lt;span style="color:#2b91af;"&gt;HttpRequest &lt;/span&gt;request)
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;request.Params[&lt;span style="color:#a31515;"&gt;&amp;quot;callback&amp;quot;&lt;/span&gt;] +&lt;span style="color:#a31515;"&gt;&amp;quot;(&amp;quot; &lt;/span&gt;+ strBuffer + &lt;span style="color:#a31515;"&gt;&amp;quot;);&amp;quot;&lt;/span&gt;;
        }

        &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Close()
        {
            _responseStream.Close();
        }

        &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;Flush()
        {
            _responseStream.Flush();
        }

        &lt;span style="color:blue;"&gt;public override long &lt;/span&gt;Seek(&lt;span style="color:blue;"&gt;long &lt;/span&gt;offset, &lt;span style="color:#2b91af;"&gt;SeekOrigin &lt;/span&gt;origin)
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;_responseStream.Seek(offset, origin);
        }

        &lt;span style="color:blue;"&gt;public override void &lt;/span&gt;SetLength(&lt;span style="color:blue;"&gt;long &lt;/span&gt;length)
        {
            _responseStream.SetLength(length);
        }

        &lt;span style="color:blue;"&gt;public override int &lt;/span&gt;Read(&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] buffer, &lt;span style="color:blue;"&gt;int &lt;/span&gt;offset, &lt;span style="color:blue;"&gt;int &lt;/span&gt;count)
        {
            &lt;span style="color:blue;"&gt;return &lt;/span&gt;_responseStream.Read(buffer, offset, count);
        }
    }
}&lt;/pre&gt;

&lt;h3&gt;4. Register the HttpModule in the service project&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;4.1 Add referance to the HttpModule assembly to the service project&lt;/p&gt;

  &lt;p&gt;4.2 Add this code to web.config to register the module&lt;/p&gt;

  &lt;p&gt;&amp;lt;add name=&amp;quot;ContentTypeHttpModule&amp;quot; 
    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type=&amp;quot;ContentTypeHttpModule.ContentTypeHttpModule, ContentTypeHttpModule&amp;quot; /&amp;gt;&lt;/p&gt;

  &lt;p&gt;This goes under system.web / httpmodules section&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;5. Add a web project for testing the application&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;5.1 add the following libs&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;jquery-1.3.1.js&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;json2.js&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;5.2 add new script file caller.js&lt;/p&gt;

  &lt;pre class="code"&gt;&lt;span style="color:blue;"&gt;function &lt;/span&gt;test() {
    $.ajax({ url: &lt;span style="color:#a31515;"&gt;&amp;quot;http://localhost:1690/JSONP-EndPoint.asmx/Sum&amp;quot;&lt;/span&gt;,
    data: { x: JSON.stringify(&lt;span style="color:#a31515;"&gt;&amp;quot;Now i am getting jsop string&amp;quot;&lt;/span&gt;), y: JSON.stringify(&lt;span style="color:#a31515;"&gt;&amp;quot;2nd param&amp;quot;&lt;/span&gt;) },
        dataType: &lt;span style="color:#a31515;"&gt;&amp;quot;jsonp&amp;quot;&lt;/span&gt;,
        success: &lt;span style="color:blue;"&gt;function&lt;/span&gt;(json) {
            alert(json.d);
        },
        error: &lt;span style="color:blue;"&gt;function&lt;/span&gt;() {
            alert(&lt;span style="color:#a31515;"&gt;&amp;quot;Hit error fn!&amp;quot;&lt;/span&gt;);
        }
    });
}&lt;/pre&gt;

  &lt;pre class="code"&gt;5.3 Add referances to &lt;em&gt;jquery-1.3.1.js&lt;/em&gt; and &lt;em&gt;json2.js&lt;/em&gt;&lt;/pre&gt;

  &lt;pre class="code"&gt;5.4 Add Default.aspx page with input button that has onclick=”return test();”&lt;/pre&gt;
&lt;/blockquote&gt;

&lt;h3&gt;6. Remarks&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;6.1 I use the JSON.stringify function to serialize the string data parameters.&lt;/p&gt;

  &lt;p&gt;6.2 .d is a security features on ASP.NET 3.5&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;&lt;a href="http://bloggingabout.net/cfs-filesystemfile.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/adelkhalil/2146.JSONP_2D00_Prototype.zip"&gt;Download the code&lt;/a&gt;&lt;/h2&gt;</description></item></channel></rss>