IIS aways returns an empty page - c#

I am deploying a site built as a set of projects in a solution which is deployed as a series of websites (one project = one url).
The coding lanague is c# and the site uses a mssql db accessed via linq.
Everything works ok on the development server but at the moment, all pages with dynamically created elements (i.e all <asp> and custom tags) output a blank page with the following source code. Static pages (standard html and aspx) display correctly.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content="text/html; charset=windows-1252" http-equiv=Content-Type></HEAD>
<BODY></BODY></HTML>
I normally work with php on LAMP and this behaviour is unlike anything I've seen in that setup. I need some fresh ideas on causes / resolution of this error (preferably step by step / tutorial links - like I say IIS/c#.net is not my normal enviroment).
Things I have tried with no effect whatsoever:
altering permissions on site folders
altering web.config settings
Redeploying site files via copy / paste and the vb publish option with various settings
Plus a whole ton (over two days so far) of internet research
Thanks for all replies.
edit:
version numbers:
iis: v6.1 (bulid: 7601)
OS: Windows web server 2008 R2 / Service pack 1
.net: v4
second edit:
Sample page:
aspx file:
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="dbtest.aspx.cs" Inherits="Rica.Yoodul.dbtest" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>test</h1>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</div>
</form>
</body>
</html>
aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
namespace Rica.Yoodul
{
public partial class dbtest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
SqlConnection myConnection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["RicaConnectionString"].ConnectionString);
myConnection.Open();
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand("SELECT * FROM dbo.MaritialStatus", myConnection);
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
Literal1.Text = Literal1.Text + myReader["Name"].ToString();
}
myConnection.Close();
}
}
}
edit:
Something I didn't add: Based on some of the other behaviour the server is displaying, I think the most likely culprit is misconfiguration of the server.
edit:
OK I've narrowed down the cause a little. By taking out everything except the langauge attribute in the first line of the front end file I can get the server to display the static content.#
edit:
OK http://www.iis.net/ConfigReference covers the use of the iis config files. Only I went to the path indicated on the page and I don't appear to have any config files at all. How do I comfirm / fix this?

It sounds like your production server doesn't have ASP.NET correctly installed/registered, so your pages are being treated as simple text documents rather than code. This can sometimes happen if you install .NET before installing IIS, for example.
To confirm this, put together a barebones page that includes a mix of HTML and ASP.NET...
<%# Page Language="C#" %>
<html>
<head>
<title>ASP.NET Hello World</title>
</head>
<body>
<p>Hello from HTML</p>
<p><%= "Hello from ASP.NET" %></p>
</body>
</html>
If you load that up and only get the plain-HTML greeting, use your browser's "View Source" option and see what you're actually getting. If your ASP.NET source-code is shown in the source the browser's receiving, that confirms that IIS didn't treat it as an ASP.NET file - which means ASP.NET isn't installed correctly or is disabled.

Related

ASP Page becoming truncated when converting to IHTMLDocument2 using .innerHTML

I'm reading in an .ASP page from a server. The problem I am having is that the page is becoming truncated when I attempted to read the data in by means of the C# code below.
Below is my code accessing the .asp page
var htmlDocument = EmbeddedBrowser.Document as IHTMLDocument2;
var htmlInnerContent = (((HTMLDocument)(htmlDocument)).documentElement).innerHTML;
Below is the .asp page as it sits on my server
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><script type="text/javascript">Lots of Java Script Here</script><script type="text/javascript">Lots more Java Script Here</script>
</head>
<body>
<input type="" name="ExpectedClientVersion" value="20.15.09"/>
</body>
</html>
Below is the content of htmlInnerContent after I read it in
<head>
<script type="text/javascript">Lots of Java Script Here</script
</head>
As you can see I am missing the body which is really what I need so I can parse the ExpectedClientVersion.
I have run a fiddler trace and I can see the entire document being passed over.
I also tried researching limitations of .InnerHTML but found only lacking documentation. There may be something to this.
I feel the way I am accessing the document may be incorrect. Does anyone have insight into this?

How do you reference HTML/ASP elements with C# objects?

I'm new to ASP.NET and C#, I've primarily worked with Java. I want to dynamically add nodes to a tree view. I've followed a few tutorials but whenever I implement them they do not appear to work. I keep getting an error: "The name 'MyTreeView' does not exist in the current context".
Here's the C# code:
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace LocalTest
{
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
MyTreeView.Nodes.Add(new TreeNode("Node1"));
MyTreeView.Nodes[0].ChildNodes.Add(new TreeNode("ChildNode"));
}
}
}
}
And the HTML/ASP:
<!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>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TreeView ID="MyTreeView" Runat="server">
</asp:TreeView>
</div>
</form>
</body>
</html>
"MyTreeView" is the ID of the treeview contained in the Default.aspx file.
The few tutorials I have followed seem to access the treeview directly with its ID as seen above which makes very little sense to me. For instance, if I were to do this in Android I would have to use the findViewById and establish a link between the XML and the Object.
Does anyone have any suggestions? I've bumbled around this site for a bit and I'veonly found similar issues but I cannot get a clear answer.
Thank you.
Looking at the code above, you are using what's known as ASP.Net WebForms where there are "server side" controls (e.g. <asp:TreeView ID="MyTreeView" Runat="server">)
The "page" (html aspx) needs to somehow "wire itself" to the code (c# file). It will need a "server-side" directive like so:
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebFormsApplication.WebForm1" %>
<!DOCTYPE html>
//...the rest of the html goes here plus web controls, etc.
At which point, you can see stuff like Inherits="WebFormsApplication.WebForm1" that maps to the Class:
namespace WebFormsApplication
{
public partial class WebForm1 : System.Web.UI.Page
....
found in the WebForm1.aspx.cs file, also in the directive CodeBehind="WebForm1.aspx.cs"
So voila :)
establish a link between the XML and the Object.
Hth...
You do not have TreeView control in default.aspx. It is in .html file and default.aspx.cs can not see TreeView control.
It seems you are missing Page directive in your asp.net page
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

Pre-set formatting on asp.net pages.

I am newish to Asp.net. I have inherited a web application project. When I create a new page it already has some formatting on the top even though I don't use any master page when creating the page. This I can see when I build the page. I am using ASP.Net 4.0, C# language.
For the life of me I cant figure out as in the underlying code for the file there is no reference to any css or any elements. The code for page.aspx is as follows:
<%# Page Language="C#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %>
<!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></title>
</head>
<body>
</body>
</html>
The code behind is as follows:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
Thanks in advance for any help I can get.
Oh Actually when you create a page in Visual studio. He create some by default code file and a project structure. Just why you show different type of file on solutions.
See on your aspx page header its define cs code file as CodeFile="Test.aspx.cs" and also Inherits test.
Also .csproj file that contains assembly references
.projRefs.sln file that contains the current project and all referenced projects
I figured it out. There was a theme applied which was adding reference to a stylesheet when compiling the page. I added disable theming tag which removed this reference for the particular page.

Upload File Script won't load because it cannot find the function bt1Clicked()

I am attempting to let a client upload a file to my server in an ASP.NET C# website. I have created a simple script to introduce myself to the nuances of both uploading a file and also creating a script where all the code (HTML and C# code) is in the same file.
My Problem: The function uploadFile() never outputs/returns any string result when it should return a string describing if the upload succeeded or why it failed.
What am I doing wrong?
PS: I have updated my web.config with the following code:
<appSettings>
<add key="folderPath" value="uploadedFiles"></add>
</appSettings>
PPS: Is there anything wrong with having my C# code & HTML all in the same .aspx file? Is it better to separate them out?
My Simple Code:
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="test.aspx.cs" Inherits="WebApplication1.test" %>
<!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></title>
<script type="text/C#">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
protected global::System.Web.UI.HtmlControls.HtmlInputFile fileUpload;
protected global::System.Web.UI.WebControls.Label lblMessage;
protected global::System.Web.UI.WebControls.Button btnSave;
protected global::System.Web.UI.HtmlControls.HtmlGenericControl test;
protected void bt1Clicked(Object sender, EventArgs e)
{
if (fileUpload.PostedFile != null)
{
string strFilename, strMessage;
strFilename = fileUpload.PostedFile.FileName.ToString();
strMessage = uploadFile(strFilename, ConfigurationManager.AppSettings["folderPath"]);
output.InnerHtml = strMessage;
}
}
public string uploadFile(string fileName, string folderName)
{
if (fileName == "")
{
return "Invalid filename supplied";
}
if (fileUpload.PostedFile.ContentLength == 0)
{
return "Invalid file content";
}
fileName = System.IO.Path.GetFileName(fileName);
if (folderName == "")
{
return "Path not found";
}
try
{
if (fileUpload.PostedFile.ContentLength <= 2048000)
{
fileUpload.PostedFile.SaveAs(Server.MapPath(folderName) + "\\" + fileName);
return "File uploaded successfully";
}
else
{
return "Unable to upload,file exceeds maximum limit";
}
}
catch (UnauthorizedAccessException ex)
{
return ex.Message + "Permission to upload file denied";
}
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input id="fileUpload" type="file" Runat="server" NAME="fileUpload"/>
<asp:button id="btnSave" runat="server" Text="Upload File" OnClick="bt1Clicked"></asp:button>
<p id="output" runat="server">Result should be displayed here after clicking</p>
</div>
</form>
</body>
</html>
If you're going to put your C# code in the front page, you'll need to put it in a <script runat="server"> tag. When I do this (which is very rarely), I'll usually put the <script> tag after the HTML. For example:
<!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">
...
</html>
<script runat="server">
//Code here
</script>
The advantage of using <script runat="server"> is that if you are writing a Web Application (where the code compiles into a dll), you can create pages that run server side without doing a new build of the application (of course you'll have to remove the CodeBehind attribute from the #Page directive). So if you're in a situation where you can't do a new build for whatever reason, writing everything in the .aspx for a one off page can be useful.
That being said, you're probably better off writing the code in the codebehind file (In your case this is test.aspx.cs, and you can get to it in VS.NET by right clicking on test.aspx in the Solution Explorer and selecting "View Code" or by pressing F7 when you're viewing the test.aspx file). Using the codebehind file separates the code from the HTML, and more importantly compilation errors will be raised when you compile the application. If you use <script runat="server">, compilation errors won't be raised until the page is accessed.
In answer to your PPS - yes in general it is considered best practice to have your C# code in a separate file. There are a few reasons for this, I'll list a few here for you:
Ease of maintenance - having the C# in another file makes it easier to fix or change things later
Easier for UI guys to work with - If you're working with a designy type person who's doing your HTML and CSS etc, it'll be easier for them to work with the mostly-html ASPX markup, without all the C# getting in the way
Precompiling - Your C# code can be precompiled away into a DLL if it's in a separate file, but if it's in an ASPX file it needs to be compiled by IIS when it is running.
There's probably a bunch of other reasons that I haven't mentioned too...
Some might say for a simple test/tutorial application you don't need to worry so much, but it's probably best to PRACTICE best practices while you are doing tutorials etc. so it doesn't seem foreign to you later on.
And if you have to put it all in one file for some reason, take rsbarro's advice above and put it in a completely separate block below the HTML so it's nice and clean.

Updating Label Text while Method is Running

Developing is more of a hobby at the moment; so apologies if this is a basic question, although after a couple of hours searching the web I can't seem to find an answer. I am currenttly building a support tool for my team which runs a number of SQL queries & BCP processes and returns the results. Some of these actions take quite a while and I would like to update the web UI with status messages. Previously I have been using the Label1.Text = text;
However now I would like to update the Label1.text multiple times while my method is running. Try as I might though it only displays the last update in the method.
I have coded a small test to try get to the bottom of this: -
Web Page
<%# Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Template._Default" %>
<!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>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="progress" runat="server" Text=""></asp:Label><br />
<asp:Image ID="Image1" runat="server" ImageUrl="~/Image/loader.gif"
Visible="False" />
</div>
</form>
</body>
</html>
C# CodeBehind
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Data.Odbc;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
namespace Template
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
uiUpdate("OUT", 1);
wait();
uiUpdate("In", 0);
}
protected void uiUpdate(string text, Int32 image)
{
if (image == 1)
{
Image1.Visible = true;
}
else
{
Image1.Visible = false;
}
progress.Text = text;
}
protected void wait()
{
DateTime wait;
wait = DateTime.Now + TimeSpan.FromSeconds(10);
while (wait > DateTime.Now)
{
}
}
Is there a way I can get the Label1 & Image to update as the Page_load is running?
Or am I looking at this the totally wrong way (no doubt!)
Thanks
HTML as a full page request is not in the least bit granular:
your browser sends a request (of all the form variables, cookies, etc etc) to the server
the server does a bit of processing and sends a response (typically html)
your browser processes the response and renders the display
All your updates are happening in the middle bullet, so no: there is no way to make the browser update: your code is executing on the server, with no dialog with the client
If you need this type of behaviour, you would have to look at AJAX tools - at each step doing "just enough" work to get to the next milestone and update the caption... with regular ASP.NET UpdatePanel may be of interest; for MVC or other (non-ASP.NET) setups, jQuery would be your friend. Unfortunately, this isn't a trivial topic.
If I understand your question correct you can't do this in regular asp.net, you need to use ajax, and make an ajax method in which you then update the text of the label on runtime. You can use the ajax MS scriptmanager to do this.
If it is not for high performance you can use an update panel otherwise you should just use the scriptmanager by yourself.

Categories