Avatar billede noem Nybegynder
09. juli 2008 - 09:51 Der er 10 kommentarer og
1 løsning

Retuner simpel CSV fil via asp.net

Hej

Jeg er helt ny til asp.net og skal have lavet en asp side der kan eksportere csv..

Jeg har oprettet en .aspx side som ser således ud:
<%@Page Language="C#" CodeBehind="~/Default.aspx" ContentType="text/csv" ClassName="_Default" %>


og som linker til min klasse som starter som vist nedenfor.

public partial class _Default : System.Web.UI.Page
{
    SqlConnection _sql;

    protected void Page_Load(object sender, EventArgs e)
    {
       
        TextWriter o = Response.Output;
        Response.ContentType = "text/csv";
        string uID;




Når jeg prøver at køre min applikation får jeg fejlen
XML tolkningsfejl: intet element fundet adresse: http://localhost:3248/WebSite1/Default.aspx linje 1, kolonne 1:

Hvad gør jeg galt ??
Avatar billede aaberg Nybegynder
09. juli 2008 - 10:00 #1
Din aspx side må ikke være tom!

prøv at ændre indholdet til:

<%@Page Language="C#" CodeBehind="~/Default.aspx" ContentType="text/csv" ClassName="_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>
   
    </div>
    </form>
</body>
</html>
Avatar billede noem Nybegynder
09. juli 2008 - 10:02 #2
Men vil den så ikke udskrive de html koder (jeg skal bruge en csv fil)
Avatar billede aaberg Nybegynder
09. juli 2008 - 10:20 #3
en aspx fil er bygget til at indeholde html.

Jeg tror du skal se på en Generic Handler (ashx i stedet for aspx). Dette er en filtype beregnet til at returnere andet end html til klientet, eksempeltvis filer, billeder eller for den sags skyld, csv filer.

på dit projekt, tryk på Add New Item. I stedet for at vælge Web Form skal du vælge Generic Handler.
Avatar billede noem Nybegynder
09. juli 2008 - 11:18 #4
Hej aaberg_cc tak for svaret,

nu har jeg lavet en .ashx fil og lagt den på min webserver

Men når jeg prøver at køre den, siger den Access Denied ?

Som jeg kan læse mig til på nettet ( http://aspalliance.com/441_Introducing_HTTPHandlers.all ) burde jeg bare kunne køre min .ashx direkte..

Har du en ide om hvorfor dette sker ?
Avatar billede aaberg Nybegynder
09. juli 2008 - 11:33 #5
Kan du køre den lokalt i visual studio?

Det lyder som en opsætningsfejl i IIS. Eller også er det en ekstern ressource du ikke har tilgang til, f.eks. en fil eller database du læser fra.

Skrive den bare Access denied, eller er der mere information?
Avatar billede noem Nybegynder
09. juli 2008 - 11:45 #6
Den kan heller ikke køre lokalt i VS

Her er fejlen

Server Error in '/CSVGenerator' Application.
HTTP Error 403 - Forbidden.
Version Information: ASP.NET Development Server 9.0.0.0

Her er koden

<%@ WebHandler Language="C#" Class="CSVHandler" %>

using System;
using System.Web;
using System.IO;
using System.Data.SqlClient;
using System.Text;

    public class CSVHandler : IHttpHandler {

        SqlConnection _sql;
       
        public void ProcessRequest (HttpContext context) {
            context.Response.ContentType = "text/csv";
            TextWriter o = context.Response.Output;

            string uID;
            SqlCommand cmd;

            try
            {
                #region build query
                uID = context.Request.Params["uID"];
                String q = @"
                    SELECT  tef.TEFault_Value Fault_ID,
                            tef.TEFault_Name Fault_Name,
                            ISNULL(er1.event_reason_name,'') reason_level1,
                            ISNULL(er2.event_reason_name,'') reason_level2, 
                            ISNULL(er3.event_reason_name,'') reason_level3, 
                            ISNULL(er4.event_reason_name,'') reason_level4
                    FROM timed_event_fault tef
                        LEFT JOIN prod_units pu on pu.pu_id = tef.pu_id
                        --LEFT JOIN prod_lines pl on pl.pl_id = pu.pl_id
                        LEFT JOIN event_Reasons er1 on er1.event_reason_id = tef.reason_level1
                        LEFT JOIN event_Reasons er2 on er2.event_reason_id = tef.reason_level2
                        LEFT JOIN event_Reasons er3 on er3.event_reason_id = tef.reason_level3
                        LEFT JOIN event_Reasons er4 on er4.event_reason_id = tef.reason_level4
                    WHERE pu.Pu_Id = '@unitID'
                    ORDER BY reason_level1,
                        reason_level2,
                        reason_level3,
                        reason_level4";
                cmd = new SqlCommand(q, _sql);
                cmd.Parameters.Add(new SqlParameter("@unitID", uID));
                #endregion

                SqlDataReader dr = Query(cmd);

                if (dr == null) /* There was an error querying Data */
                    return; //Return ""

                #region Output to response stream
                while (dr.Read())
                {
                    o.WriteLine(string.Join(",", new string[]
                        {
                            dr["Fault_ID"].ToString(),
                            dr["Fault_Name"].ToString(),
                            dr["reason_level1"].ToString(),
                            dr["reason_level2"].ToString(),
                            dr["reason_level3"].ToString(),
                            dr["reason_level4"].ToString()
                      }));
                }
                #endregion
               
                dr.Close(); /* Close Reader when done */

            }
            catch (Exception ex)
            {

            }

        }

        #region Internal Methods

        public SqlDataReader Query(SqlCommand c)
        {
            if (this._sql == null)
                this._sql = new SqlConnection(this.generateConnectionString());

            if (this._sql.State != System.Data.ConnectionState.Open)
                this._sql.Open();
            c.Connection = this._sql;


            try { return c.ExecuteReader(System.Data.CommandBehavior.Default); }
            catch (SqlException se)
            {
                throw se;
            }


        }

        /// <summary>
        /// Generate A conectionString
        /// </summary>
        /// <returns></returns>
        private String generateConnectionString()
        {
            /* Build connectionstring */
            StringBuilder sb = new StringBuilder();
            /* Server */
            sb.Append("server=");
            sb.Append("green");
            sb.Append(";");

            /* Database */
            sb.Append("database=");
            sb.Append("GBDB");
            sb.Append(";");

            /* User */
            sb.Append("user id=");
            sb.Append("user");
            sb.Append(";");

            /* Password */
            sb.Append("password=");
            sb.Append("user");
            sb.Append(";");

            return sb.ToString();
        }

        #endregion
       
        public bool IsReusable {
            get {
                return false;
            }
        }

    }
Avatar billede aaberg Nybegynder
09. juli 2008 - 12:04 #7
Prøv at sætte en breakpoint i starten af koden og debugge dig ned igennem for at se om fejlen sker i din kode. Hvis koden slet ikke køre, tjek at hele URLen står i adressebaren i browseren, inklusiv filnavnet på ashx filen. Ellers, prøv at finde ud af hvor fejlen sker. Det er næsten umuligt for mig at fejlsøge det, da jeg jo ikke kan koble på din Sql server. Hvis du kan komme med et linjenummer, kan det være jeg kan hjælpe.
Avatar billede noem Nybegynder
09. juli 2008 - 12:39 #8
Selvom jeg sætter breakpoint i første linje, når der ikke dertil _:(
Avatar billede aaberg Nybegynder
09. juli 2008 - 12:57 #9
Jeg må sgu indrømme at jeg er ved at løbe tør for ideer. En mulighed jeg kan komme i tanke om: Hvis du bruger Firefox, Opera eller en eller anden ikke-microsoft browser, prøv at åbne den i IE. Hvis dette virker er det et opsætningspørgsmål. Prøv da at højreklikke på projektet og tryk Property Pages. Under punktet Start Options i Server regionen, sørg for at NTLM Authentication IKKE er valgt.
Avatar billede noem Nybegynder
09. juli 2008 - 14:00 #10
Efter at at have en ny solution i VS, virkede det hele :)

Mange tak for hjælpen aaberg_cc :)

Lægger du lige et svar ?

/Thomas
Avatar billede aaberg Nybegynder
09. juli 2008 - 14:07 #11
Mærkeligt. Men godt du fik det til at virke.

Her kommer svaret. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester