Avatar billede steen_hansen Forsker
18. maj 2005 - 01:05 Der er 28 kommentarer og
2 løsninger

Header-problem

Jeg har fået lagt mit webhotel over hos concor.dk, og her støder jeg på et Header Error-problem konstant. Jeg er bange for, at jeg skal omskrive samtlige sider for at få løst problemet.

Denne fejl kan normalt løses med Response.Buffer = True i toppen af dokumentet, men ikke altid:

The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content.


Her følger et eksempel fra det "gamle" webhotel, som fungerede perfekt:

<%

    Dim Conn, RS

    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Websider\resadmin\include.dk\include.dk\www\fpdb\include.mdb"

    Set RS = Conn.Execute("SELECT * FROM profiles WHERE username='" & SQLEncode(Request.QueryString("user")) & "'")

    If RS.EOF Then
        RS.Close
        Conn.Close
        Response.Redirect "/error.asp?msg=Brugeren+eksisterer+ikke."
    End If

    Dim vCreated
    vCreated = RS("created")
    vCreated = addZ(day(vCreated)) & "-" & addZ(month(vCreated)) & "-" & year(vCreated) & " " & addZ(hour(vCreated)) & ":" & addZ(minute(vCreated)) & ":" & AddZ(Second(vCreated))

    Dim vLastSeen
    vLastSeen = RS("lastseen")
    vLastSeen = addZ(day(vLastSeen)) & "-" & addZ(month(vLastSeen)) & "-" & year(vLastSeen) & " " & addZ(hour(vLastSeen)) & ":" & addZ(minute(vLastSeen)) & ":" & AddZ(Second(vLastSeen))

    If RS("phone") <> "" Then
    Dim strPhone
    strPhone = Mid(Server.HTMLEncode(RS("phone")),1,2) & " " & Mid(Server.HTMLEncode(RS("phone")),3,2) & " " & Mid(Server.HTMLEncode(RS("phone")),5,2) & " " & Mid(Server.HTMLEncode(RS("phone")),7,2)
    End If

    If RS("cellphone") <> "" Then   
    Dim strCellphone
    strCellphone = Mid(Server.HTMLEncode(RS("cellphone")),1,2) & " " & Mid(Server.HTMLEncode(RS("cellphone")),3,2) & " " & Mid(Server.HTMLEncode(RS("cellphone")),5,2) & " " & Mid(Server.HTMLEncode(RS("cellphone")),7,2)
    End If

%>

<html>

<head>
........
</head>

<body>

<form>
.......
</form>

</body>

</html>

Problemet fremkommer typisk ved en redirect:

        Response.Redirect "/error.asp?msg=Brugeren+eksisterer+ikke."

Der forsøges redirected til en anden side, når headeren allerede er skrevet én gang i browseren?

Hvad forårsager det, og hvad skal jeg gøre for at løse det? Jeg skal lige sige, at jeg er skiftet fra MS Access til MySQL, men jeg tvivler på, at det er her problemet ligger.

HJÆLP :)
Avatar billede steen_hansen Forsker
18. maj 2005 - 01:07 #1
Jeg skal lige huske at sige, at jeg har omskrevet conn-stringen, så der kan skabes forbindelse til MySQL-databaseserveren. Resten af VB-scriptene burde ikke være forskellig, uanset om man benytter MS Access eller MySQL?
Avatar billede thesurfer Nybegynder
18. maj 2005 - 01:19 #2
"The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content."

Fejlen opstår, hvis du har udskrevet noget til browseren/klienten inden du redirector..

Eksempler:

--- eks 1 --
<%
response.write "hello world" <---
response.redirect...
%>
------------

--- eks 2 ---
hello world.. dette er almindelig tekst
<%
response.redirect...
%>
-------------

I begge eksempler, er der sendt data til browseren/klienten.. dette vil udløse fejlen.
Avatar billede steen_hansen Forsker
18. maj 2005 - 01:23 #3
Lyder fornuftigt. Men hvordan løses det?

HVIS RS.EndOfFile SÅ
    LUK RS
    LUK CONN
SEND BRUGEREN TIL EN GIVEN SIDE

Det er jo et udsagn, som enten er sandt eller falsk. Hvordan skal den kringles?
Avatar billede ldanielsen Nybegynder
18. maj 2005 - 01:29 #4
Du må have nogle includerede filer. Hvor kommer functionen SQLEncode fra?
Avatar billede thesurfer Nybegynder
18. maj 2005 - 01:33 #5
Hvis det ikke er inc-filen (som ldanielsen nævner), kan det være at der er et mellemrum, før den "<%" i toppen af din kode..

"<" i "<%" skal være det første tegn, på den første linie..
Avatar billede steen_hansen Forsker
18. maj 2005 - 01:33 #6
Den kommer fra functions.asp:

<%
Function SQLEncode(strSQL)
    SQLEncode = Replace(strSQL,"'","''")
End Function
%>

Men alt det burde ikke have nogen indflydelse. Eller ..?
Avatar billede steen_hansen Forsker
18. maj 2005 - 01:34 #7
thesurfer: Det er det også:

<%
.....
%>
Avatar billede thesurfer Nybegynder
18. maj 2005 - 01:39 #8
Functionen er ok..

For at være helt sikker, så ser filen sådan ud (linie for linie):
--- filen starter her ---
<%
...
%>
--- filen slutter her ---

og ikke sådan her:

--- filen starter her ---

<%
...
%>
--- filen slutter her ---

Forskellen er, at ved eksempel 2 er der et mellemrum/tom linie, lige før "<%"-linien..

Hvis det er al den koden du har, kan jeg ikke se hvad problemet er..
Avatar billede steen_hansen Forsker
18. maj 2005 - 02:09 #9
Jeg kan ikke holde øjnene åbne længere, må hellere få et par timers søvn. Snakkes ved i morgen :)
Avatar billede steen_hansen Forsker
18. maj 2005 - 07:24 #10
Jeg har en protect.asp, som tjekker om sessionen er forskellig fra ingenting:

<%
If Session("username") = "" Then
    Response.Redirect "/error.asp?msg=Log+venligst+ind+inden+du+benytter+denne+side.&redir=" & server.URLEncode(Request.ServerVariables("HTTP_URL"))
End If
%>

Den giver bøvl i Opera, men ikke i andre browsere. Men her er det tydeligt, at filen starter fra top, som alle de andre dokumenter:

Start af dokument <-----
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%
..........
%>

<html>

............................
Avatar billede busschou Praktikant
18. maj 2005 - 07:36 #11
Din doctype er html så hvis du laver en doctype og derefter sender nye headers så får du fejl ;o)
Avatar billede webt Nybegynder
18. maj 2005 - 07:41 #12
Nu er ASP ikke lige min stærke side men går da ud fra at lige som med php er der mulighed for output buffering? noget i stil med Response.buffer=true og så Response.flush i slutningen af dokumentet.

På den måde vil du undgå fejlene med headerne, men ulempen er jo så at folk skal vente på siden er loadet helt før de får den at se.

Som sagt ASP er ikke min stærke side men mon ikke det er muligt?
Avatar billede ldanielsen Nybegynder
18. maj 2005 - 09:15 #13
i de includefiler, laver du noget med Request.Cookies?
Avatar billede thesurfer Nybegynder
18. maj 2005 - 10:34 #14
Opera cacher sider og input.. dvs, hvis du har skrevet et langt indlæg, og kommer til at klikke på et link, kan du navigere tilbage, og dit indlæg vil stadig stå i tekst-feltet.. Password (det man skrive i et type="password") caches *ikke*..

PS: Se lige 18/05-2005 07:36:58..
Avatar billede steen_hansen Forsker
18. maj 2005 - 14:28 #15
Jeg er ikke helt med på hvad busschou mener?
Avatar billede steen_hansen Forsker
18. maj 2005 - 14:29 #16
webt, jeg vil kigge på det :)
Avatar billede busschou Praktikant
18. maj 2005 - 14:32 #17
Jeg mener:
--
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%
RESPONSE.REDIRECT ""
%>
--
Det går ikke fordi doctype erklæringen er HTML kode..selvom den ikke står inden i dit html tag
Problemet med headers er når man laver en redirect og der bare er lavet så meget som eet eneste tegn udkrevet først
Dog har jeg så aldrig personligt oplevet problemet i asp før...kun i php
Avatar billede steen_hansen Forsker
18. maj 2005 - 15:30 #18
1. Dvs. jeg reelt bare kan flytte div. VB-scripts over <!DOCTYPE...?
2. SKAL doctype ikke stå aller øverst i dokumentet for at det kan valideres?

På den anden side, så er scriptene jo kun scripts, og ikke output.

Jeg MENER at have hørt, at problemet kan opstå med Chilli ASP. Eller er det bare en skrønne?
Avatar billede busschou Praktikant
18. maj 2005 - 15:37 #19
Det er nok fordi det er sådan en "sjov asp" ;o)
Ja alt kode øverst - korrekt
Doctype skal stå øverst i din udskrift til browseren
Husk på klienten ser ikke din vb kode!
Avatar billede busschou Praktikant
18. maj 2005 - 15:38 #20
Når du validerer en side. Så validerer du kun "den rene html" dvs det du ser når du vælger "vis kode"
Det være sig html, javascript mm.
Men ikke ASP, PHP som kører på serveren
Håber det kaster lidt lys over sagen?
Avatar billede busschou Praktikant
18. maj 2005 - 15:39 #21
I øvrigt så tror jeg at grunden til at det sker med Chili ASP er at det er en type asp som kører på unix/linux servere
Jeg er ikke 100% men jeg kunne forestille mig det var forklaringen , for jeg har aldrig oplevet det på en windows maskine
Avatar billede thesurfer Nybegynder
20. maj 2005 - 12:17 #22
http://www.concor.dk/webpages/webhosting/info.asp står der:

ConCor har en Services Provider License aftale med Microsoft (SPLA), og kan her igennem tilbyde hosting på Windows servere: http://www.microsoft.com/danmark/hosting/partner.asp

Så jeg vil gå ud fra, at de kører ASP på Windows-servere..


Hvis du gør følgende, burde du ikke have problemer:

--- fil start ---
<% Response.Buffer = True %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%
noget mere asp kode her
%>

noget html kode eller whatever..

-- fil slut --

Så længe at "Response.Buffer = True" er det FØRSTE (!!) i filen, gør det ikke noget..
Avatar billede steen_hansen Forsker
20. maj 2005 - 21:18 #23
thesurfer, jeg har prøvet det, og nogle steder virker det, men (vistnok) ikke alle. Jeg vil prøve at gå det igennem igen og evt. smide det kode, jeg evt. har problemer med.

Response.Buffer = True

bevirker, at det hele samles i bufferen, inden det sendes til klienten, gør det ikke?

Undskyld ventetiden. Jeg har ikke glemt Jer. Jeg har lige lagt en ny terasse, så jeg har haft rimelig travlt :)
Avatar billede thesurfer Nybegynder
20. maj 2005 - 21:24 #24
Response.Buffer = True burde virke alle steder.. og jo, hele siden dannes før den sendes til klienten.

Har du evt et test-område, så vi kan følge udviklingen?
Avatar billede steen_hansen Forsker
22. maj 2005 - 01:13 #25
busschou/thesurfer, så lykkedes det:

DOKUMENTET:

<%
Response.Buffer = True

[DB-forbindelse åbnes]

If RS.EOF Then
    .......
    .......
    Response.Redirect .......
End If
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>
<title></title>
</head>

<body>

[En masse HTML og ASP]

</body>

</html>

<% [DB-forbindelse lukkes] %>


Lægger I begge et svar? :)
Avatar billede thesurfer Nybegynder
22. maj 2005 - 01:43 #26
"sagde det jo" ;-)
- Svar smidt :-)
Avatar billede busschou Praktikant
22. maj 2005 - 08:02 #27
oki.. godt det virker ;o)
Avatar billede steen_hansen Forsker
22. maj 2005 - 22:23 #28
Nye, bedste venner, 9875987544334365679857 tak for hjælpen. Nu kører jeg med klatten igen :)
Avatar billede thesurfer Nybegynder
23. maj 2005 - 09:10 #29
Kun 9875987544334365679857?
Tsk tsk.. jeg hjælper dig ikke mere i fremtiden.. ;-)
Avatar billede steen_hansen Forsker
23. maj 2005 - 20:56 #30
:oD

Så 9875987544334365679858 da! :)
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
Kurser inden for grundlæggende programmering

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