Advertisement

08.17.2008 at 05:54AM PDT, ID: 23654517
[x]
Attachment Details
[x]
The Solution Rating System

With so many solutions, how can you tell which solutions are most likely to help you and which ones are not? To provide you with a tool to use, we rate our solutions based on various elements that most accurately determine if a solution is a quality solution. To explain what factors affect the solution rating, here are the elements we take into consideration when formulating our solution rating.

  • The Grade of the Solution
  • The Zone Rank of the Expert Providing the Solution
  • The Number of Author and Expert Comments
  • The Number of Experts Contributing
  • The Feedback of the Community

Your Input Matters
Because of the way the system is set up, the most important variable in this equation is you. As a member of Experts Exchange, you are able to cast your vote on the quality of the solutions in regard to how complete, accurate, helpful and easy to understand each solution is. When you provide your feedback, each rating is adjusted accordingly. So, if you see a solution that has a poor rating that you think is a good solution, let us know by rating it. As you do, the rating will be adjusted and will become more accurate for other members of our site.

If you have any suggestions that you would like to make for our rating system, please ask a question in the Suggestions Zone of Community Support.

Thank you!

9.2

How can I get a basic working AJAX Cross Site Proxy in C#?

Asked by Denisdh in Asynchronous Javascript and XML (AJAX), C# Programming Language, Programming for ASP.NET

Tags: ,

I'm looking for a working AJAX proxy to use to send and receive API requests/responses to http://ww1.caliber.ie/cram/api

I have the clientside code from Caliber (attached) that gives an example of how their API is used but can't get it working till I get a working proxy. I've read alot articles and ebooks. I've taken code from http://www.codeproject.com/KB/ajax/ajaxproxy.aspx (Example below) but can't get it to work. I get a missing assembly error for "using ProxyHelpers;" when I have it in a .ashx file.

I'm not sure how to go about writing my own are even altering this one. I don't know if it should be in a .aspx, .ashx or .asmx file.

Can anyone help me get this proxy attached working?
or
Can anyone point me to a working C# AJAX proxy?

I have a high level understanding of what's going on but keep getting lost when I get down into the coding of the process.Start Free Trial
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
292:
293:
294:
295:
296:
297:
298:
299:
300:
301:
302:
303:
304:
305:
306:
307:
308:
309:
310:
311:
312:
313:
314:
315:
316:
317:
318:
319:
320:
321:
322:
323:
324:
325:
326:
327:
Proxy.ashx:
 
<%@ WebHandler Language="C#" Class="proxy" %>
 
using System;
using System.Web;
using System.Web.Caching;
using System.Net;
using ProxyHelpers;
 
public class RegularProxy : IHttpHandler {
        
    public void ProcessRequest (HttpContext context) {
        string url = context.Request["url"];
        int cacheDuration = Convert.ToInt32(context.Request["cache"]?? "0");
        string contentType = context.Request["type"];
 
        // We don't want to buffer because we want to save memory
        context.Response.Buffer = false;
 
        // Serve from cache if available
        if (context.Cache[url] != null)
        {
            context.Response.BinaryWrite(context.Cache[url] as byte[]);
            context.Response.Flush();
            return;
        }
        using (WebClient client = new WebClient())
        {
            if (!string.IsNullOrEmpty(contentType))
                client.Headers["Content-Type"] = contentType;
            
            client.Headers["Accept-Encoding"] = "gzip";
            client.Headers["Accept"] = "*/*";
            client.Headers["Accept-Language"] = "en-US";
            client.Headers["User-Agent"] = 
                   "Mozilla/5.0 (Windows; U; Windows NT 6.0; " + 
                   "en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6";
            
            byte[] data = client.DownloadData(url);
 
            context.Cache.Insert(url, data, null,
                        Cache.NoAbsoluteExpiration,
                        TimeSpan.FromMinutes(cacheDuration),
                        CacheItemPriority.Normal, null); 
            
            if (!context.Response.IsClientConnected) return;
 
            
            // Deliver content type, encoding and length
            // as it is received from the external URL
            context.Response.ContentType = 
                    client.ResponseHeaders["Content-Type"];
            string contentEncoding = 
                   client.ResponseHeaders["Content-Encoding"];
            string contentLength = 
                   client.ResponseHeaders["Content-Length"];
 
            if (!string.IsNullOrEmpty(contentEncoding))
                context.Response.AppendHeader("Content-Encoding", 
                                              contentEncoding);
            if (!string.IsNullOrEmpty(contentLength))
                context.Response.AppendHeader("Content-Length", 
                                              contentLength);
 
            if (cacheDuration > 0)
                HttpHelper.CacheResponse(context, cacheDuration);
            
            // Transmit the exact bytes downloaded
            context.Response.BinaryWrite(data);
        }
    }
 
    public bool IsReusable {
        get {
            return false;
        }
    }
 
}
 
End Proxy.ashx
 
Default2.aspx:
 
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>XML Test</title>
    <script type="text/javascript" runat="server">
        var isFirefox = false;
        if (typeof netscape != "undefined" &&
	        typeof netscape.security != "undefined" &&
	        typeof netscape.security.PrivilegeManager != "undefined" &&
	        typeof netscape.security.PrivilegeManager.enablePrivilege != "undefined") {
	        isFirefox = true;
        }
        function firefoxPermissionDeniedMessage(text) {
	        return "Permission denied to: " + text + "\n" +
	        "If you were not asked for permission and still want to perform this function,\n" +
	        "then type 'about:config' in the address bar, press Enter, find the property named\n" +
	        "'signed.applets.codebase_principal_support'\n" +
	        "and change its value to true.\n" +
	        "Then try this function again.";
        }
        var createXMLHttpRequest = function() {
	        // IE7 and Firefox 
	        if (typeof XMLHttpRequest != "undefined") { 
 
 
		        return function() { 
			        return new XMLHttpRequest();
		        }
	        }
	        // old IE
	        if (typeof ActiveXObject != "undefined") { 
		        return function() { 
			        return new ActiveXObject("Msxml2.XMLHTTP");
		        }
	        }
	        alert("XMLHttpRequest not supported");
	        return function() { 
		        return null;
	        }
        }();
        function encodeHTML(str) {
           return str.toString().replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
        }
        function decodeXML(str) {
           return str.toString().replace(/&amp;/g,"&").replace(/&lt;/g,"<");
        }
        function encodeXML(str) {
           return str.toString().replace(/&/g,"&amp;").replace(/</g,"&lt;");
        }
 
        // all requests must be UTF-8 encoded
        // root node is <request>
        // must contain a <header> which must contain a valid <userId> and <password>
        // must contain a <body> which must contain a valid <command>
        // <body> can also contain a <parms> element which in turn contains one or more <parm> elements
        // sequence is important so the parameter must exist even if optional
        // each API determines the number of <parm> elements that must be defined, if any
 
        // all responses are UTF-8 encoded
        // root node is <response>
        // will contain a <header> which in turn will contain a <success> element with value 1 for yes or 0 for no
        // if <success> is no ("0") then the next element in <header> will be <error> containing an error message
        // if <success> is yes ("1") then <response> will contain a <body> which will contain one or more <record> elements
        // the format of the <record> elements is determined by the API
        // uncomment the alert(xmlStr) statement below to see the XML response
 
        // The following string shows the format of the searchJobs API
        	
        var xmlString = 
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<request>' +
        '<header>' +
	        '<userId>*GUEST</userId>' +
	        '<password>guest</password>' +
        '</header>' +
        '<body>' +
	        '<command>searchJobs</command>' +
	        '<parms>' +
		        // maxHits: for top five jobs put 5 here (integer)(optional)
		        '<parm>100</parm>' +
		        // space delimited list of vacancy statuses (required)
		        '<parm>Open</parm>' +
		        // space delimited list of vacancy categories (optional)
		        '<parm></parm>' +
		        // space delimited list of vacancy categories 2 (optional)
		        '<parm></parm>' +
		        // space delimited list of vacancy categories 3 (optional)
		        '<parm></parm>' +
		        // preferred location (optional)
		        '<parm></parm>' +
		        // preferred salary (integer)(optional)
		        '<parm></parm>' +
		        // list of keywords and/or double-quoted phrases (optional)
		        '<parm></parm>' +
	        '</parms>' +
        '</body>' +
        '</request>';
 
        // The following string shows the format of the getVacancy API (get a specific job by vacancy ID)
        	
        var xmlString2 = 
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<request>' +
        '<header>' +
	        '<userId>*GUEST</userId>' +
	        '<password>guest</password>' +
        '</header>' +
        '<body>' +
	        '<command>getVacancy</command>' +
	        '<parms>' +
		        // vacancyId (required)
		        '<parm>*vacancyId</parm>' +
	        '</parms>' +
        '</body>' +
        '</request>';
 
        // The following string shows the format of the getVacancyDescriptions API (get detailed descriptions by vacancy ID)
        	
        var xmlString3 = 
        '<?xml version="1.0" encoding="UTF-8"?>' +
        '<request>' +
        '<header>' +
	        '<userId>*GUEST</userId>' +
	        '<password>guest</password>' +
        '</header>' +
        '<body>' +
	        '<command>getVacancyDescriptions</command>' +
	        '<parms>' +
		        // vacancyId (required)
		        '<parm>*vacancyId</parm>' +
	        '</parms>' +
        '</body>' +
        '</request>';
 
        function post(xmlString) {
	        var xmlhttp = createXMLHttpRequest();
	        var url = encodeURIComponent('http://ww1.caliber.ie/cram/api');
	        if (isFirefox) {
		        try {
			        netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		        } catch (e) {
			        alert(firefoxPermissionDeniedMessage("UniversalBrowserRead"));
		        }
	        }
            xmlhttp.open('POST','proxy.ashx?url=' + url, true);
	        xmlhttp.setRequestHeader("Content-Type", "text/xml; charset=UTF-8");
	        try {
		        xmlhttp.send(xmlString);
		        if (xmlhttp.status != 200) {
			        return {"ok": false, "msg": "API failed with HTTP status code: " + xmlhttp.status};
		        }
		        //var xmlStr = xmlhttp.responseXML.xml;
		        var xmlStr = xmlhttp.responseText;
		        if (xmlStr == "") {
			        return {"ok": false, "msg": "No response from Caliber"};
		        }
		        //alert(xmlStr);
		        if (window.ActiveXObject) {
			        var doc = new ActiveXObject("Microsoft.XMLDOM");
			        doc.async = "false";
			        doc.loadXML(xmlStr);
		        }
		        else { // code for Mozilla, Firefox, Opera, etc.
			        var parser = new DOMParser();
			        var doc = parser.parseFromString(xmlStr, "text/xml");
		        }
		        var x = doc.getElementsByTagName("success")[0];
		        var success = x.firstChild.nodeValue;
		        if (success != "1") {
			        var err = x.nextSibling.firstChild.nodeValue;
			        return {"ok": false, "msg": err};
		        }
	        }
	        catch (e) {
		        return {"ok": false, "msg": "Caliber is not ready, please try again later (" + e.message + ")"};
	        }
	        return {"ok": true, "doc": doc};
        }
        function listJobs() {
	        var result = post(xmlString);
	        if (!result.ok) return alert(result.msg);
	        var doc = result.doc;
	        var descs = doc.getElementsByTagName("description");
	        var ids = doc.getElementsByTagName("vacancyId");
	        var listElem = document.getElementById("list");
	        var list2Elem = document.getElementById("list2");
	        if (list2Elem) listElem.removeChild(list2);
	        list2Elem = document.createElement("div");
	        listElem.appendChild(list2Elem);
	        for (var i = 0, n = descs.length; i < n; i++) {
		        var divElem = document.createElement("div");
		        var aElem = document.createElement("a");
		        aElem.href = "javascript: showJob(" + ids[i].firstChild.nodeValue + ")";
		        var txtNode = document.createTextNode(descs[i].firstChild.nodeValue);
		        aElem.appendChild(txtNode);
		        divElem.appendChild(aElem);
		        list2Elem.appendChild(divElem);
	        }
        }
        function showJob(vacancyId) {
	        var result = post(xmlString2.replace(/\*vacancyId/,vacancyId));
	        if (!result.ok) return alert(result.msg);
	        var doc = result.doc;
	        var salaryRange = "";
	        var node = doc.getElementsByTagName("salaryRange")[0].firstChild;
	        if (node) salaryRange = node.nodeValue;
	        //alert(salaryRange);
	        var details= document.getElementById("details");
	        details.innerHTML = "Salary range: " + salaryRange;
 
	        var result = post(xmlString3.replace(/\*vacancyId/,vacancyId));
	        if (!result.ok) return alert(result.msg);
	        var doc = result.doc;
	        var desc = "";
	        var node = doc.getElementsByTagName("externalDesc")[0].firstChild;
	        if (node) desc = node.nodeValue;
	        //alert(desc);
	        var iframe = document.getElementById("desc").contentWindow;
	        iframe.document.open();
	        iframe.document.write(decodeXML(desc));
	        iframe.document.close();
        }
    </script>
</head>
 
<body>
    <form id="form1" runat="server">
        <div id="content" style="margin-top:10px;">
        <button id="okButton" onclick="listJobs();">List</button></div>		
        <div id="list" style="margin-top:10px;height:80px;width:350px;overflow:auto;border:1px solid #ccc;">
        </div>
        <div id="details"></div>		
        <iframe id="desc" style="margin-top:10px;height:280px;width:350px;overflow:auto;">
        </iframe>
    </form>
</body>
</html>
 
End Default2.aspx
 
Loading Advertisement...
 
[+][-]08.17.2008 at 06:55PM PDT, ID: 22249036

View this solution now by starting your 14-day free trial. Setting up your free trial is quick, easy, and secure. We will return you to this solution, unlocked, when you're done.

 

About this solution

Zones: Asynchronous Javascript and XML (AJAX), C# Programming Language, Programming for ASP.NET
Tags: AJAX / ASP.Net / C#, All commonly used browsers
Sign Up Now!
Solution Provided By: philipjonathan
Participating Experts: 1
Solution Grade: A
 
 
[+][-]08.20.2008 at 09:02AM PDT, ID: 22271124

Often, when Experts are collaborating with members who have asked questions, they will request additional information about the problem. Askers respond with an author comment like this one.

Start your 14-day free trial to view this Author Comment or ask the Experts your question.

 
 
Loading Advertisement...
20081112-EE-VQP-43 / EE_QW_2_20070628