Showing posts with label pretty. Show all posts
Showing posts with label pretty. Show all posts

Saturday, March 24, 2012

Call ASP.NET web service and return JSON using only html/javascript

I've implmented a pretty basic webservice as per below. I did a quick test in ASP.NET AJAX using the ScriptManager and it returned JSON-formatted data perfectly. I am now trying to do the same using just html/javascript with the XmlHttpRequest object.

Currently I've assigned the context-type to the XmlHttpRequest as is apparently required, and the webservice is "working", but only returning xml.Surprise

I'd really appreciate any help - or maybe even a better way to access the ASP.NET web service externally (i.e. outside of ASP.NET). Thanks.

PART A: ASP.NET Webservice snippet

[WebService(Namespace = "http://microsoft.com/webservices/";
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ScriptingService : OrYxBaseWebService {
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public ScriptPersonRoleList GetActiveCategoryManagers() {
OrYxAppStatus myStatus = BFManager.GetInstance().CreateStatus(GetDefaultRequest());
return BFManager.ScriptingBF.GetActiveCategoryManagers(ref myStatus);
}
}

PART B: Index html

<html>
<head>
<title>Ajax Test Drive</title>
<script type="text/javascript" language="javascript">

function makePOSTRequest(url, parameters) {
http_request = false;
if (window.XMLHttpRequest) { // Mozilla, Safari,...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
// set type accordingly to anticipated content type
// http_request.overrideMimeType('text/xml');
http_request.overrideMimeType('text/html');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
alert("not good at all..");
}
}
}
if (!http_request) {
alert('Cannot create XMLHTTP instance');
return false;
}

http_request.onreadystatechange = confirmResponse;
http_request.open('POST', url, true);
http_request.setRequestHeader("Content-Type", "application/json");

http_request.send(parameters);
}

function confirmResponse() {
if (http_request.readyState == 4) {
if (http_request.status == 200) {
result = http_request.responseText;
document.getElementById('databox').innerHTML = result;
alert('Response:\n\n' + result);
} else {
alert('There was a problem with the request.');
}
}
}

function getData() {
var url = 'http://localhost/TVScriptingWebService/TVScripting.asmx/GetActiveCategoryManagers';
var request = makePOSTRequest(url, "");
}
</script>

</head>
<body onload="getData()">
<div style="width: 600px; padding: 10px; border: 1px solid;" align="center">
Test page</div>
<br>
<div id="databox">
</div>
<br>
</body>
</html>

What format do you want data in now?


I am wanting JSON not XML.


use text/json rather than application/json


Thanks for the response, I tried adding the following lines, but they all still return only xml as the responseText

http_request.setRequestHeader('Content-Type','text/json');


Could i again confirm that the webservice is actually returning JSON data?


The only time I have seen the webservice returns JSON data is when its called from within ASP.NET AJAX pages using the ScriptManager - which I don't want to do because these services are ultimately going to be called from a php application..

I am trying to call it using using only javascript/html and cannot get it to return JSON - only xml

Environment: ASP.NET 2.0, AJAX ASP.NET RC1. Tested on IIS5.1 and IIS6

Thanks


Well again it could be an inadvertant policy issue where microsoft doesnt want people to use other products just like datatable which is not returned as webservice. But you can always convert xml to json.

Let me see your code for consuming page in .net


Hi naturehermit,

Thanks again. You're right I could parse the xml into Json within the client, however I think that would eliminate one of the main advantages of using JSON..Wink

I couldn't get it to work so I've implemented my own IHttpHandlerFactor and IHttpHandler classes which was pretty easy. They now intercept the webservice calls and check whether use my classes, which return JSON using the JavaScriptSerializer, or the generic WebServiceHandlerFactory().

Currently the flag I've decided on is if there is an "application/OrYxJson" within the Context-Type property of the request. If this property is set, JSON gets returned, otherwise you get good old SOAP.

Early days, but so far so good..


Good luck mate, let me know if i could be of any help. Its always good to share your experiences


Yep agreed and willdo. Thanks.


naturehermit:

What format do you want data in now?


?


Hi,

I ran into same issue where I specified in the webservice JSON and yet XML was returned. Anyway, I found ot that it actually returns JSON. Try running fiddler to intercept the response from the webservice and you'll see the JSON string. Ignore the "_type".

Thanks

Wednesday, March 21, 2012

CalendarExtender RegisterCssReferences Problem

I have an issue when using the CalendarExtender control on an existing page. I'm pretty sure I know why it's happening, I just don't know how to fix it

My aspx page has the <head runat=server> which is required by the script manager to insert what I assume is the CSS references required by the calendar extender control.

The problem is, I get an exception stating:

The Controls collection cannot be modified because the control contains code blocks

We have javascript sitting in the head tag which uses class references to variables that point to aspx page names for example, so we don't have hardcoded page names all over the place. We also have an older implementation of "skinning" where the stylesheet is linked dynamically from a cookie variable, this is where the <%= code blocks are coming from and can't be removed.

Is there a solution to this? I understand the error but find it odd that code blocks are completely blocked in the head tag now

bump...... nobody?

I can't be the only one using code blocks within the <head> tag lol


Hi,

Can you provide a simple sample to illustrate the problem?


Sure, here's really simplified version but it demonstrates the error:

Default2.aspx

<%@.PageLanguage="VB"AutoEventWireup="false"CodeFile="Default2.aspx.vb"Inherits="Default2" %>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headrunat="server">

<title>Untitled Page</title>

<scriptlanguage="javascript">

alert('<%=Default2.SomeVariable %>');

</script>

</head>

<body>

<formid="form1"runat="server">

<div>

<asp:ScriptManagerID="ScriptManager1"runat="server">

</asp:ScriptManager>

</div>

<br/>

<asp:TextBoxID="TextBox1"runat="server"></asp:TextBox>

<ajaxToolkit:CalendarExtenderID="CalendarExtender1"runat="server"TargetControlID="TextBox1">

</ajaxToolkit:CalendarExtender>

</form>

</body>

</html>

In the code behind:

PublicShared SomeVariableAsString ="Hello"


I can see it now.

This is caused by how the Extender works internally. When an Extender is about to be rendered, it examine what css files are required and added it dynamically. So the exception is thrown.

To solve it, please don't use code block in html source directly. You may register it dynamically withRegisterClientScriptBlock method in code behind.


Raymond Wen - MSFT:

I can see it now.

This is caused by how the Extender works internally. When an Extender is about to be rendered, it examine what css files are required and added it dynamically. So the exception is thrown.

To solve it, please don't use code block in html source directly. You may register it dynamically withRegisterClientScriptBlock method in code behind.

Don't use code blocks? Put all my javascript in the code-behind?

Sorry but that's just ludicrous, there has to be another solution? I don't understand why the extender is not able to write a <link> tag in the head section just because there are code blocks present


Asp.net doesn't allow a container's control to be moved when the contaner has code blocks, this may not work reliably.

Another solution is you may move the code block out of the Header, and place it into the Form.