1

Ich habe bereits einen HTTPHandler geschrieben, der von einer ColdFusion-Seite POSTED wird, und es funktioniert erfolgreich; Jetzt versuche ich eine Webanwendung in ASP.NET zu schreiben, damit ich ein Formular an den .ashx-Handler von einer ASPX-Seite aus senden kann.Warum mein httpwebrequest-Post zu myhandler.ashx mit Statuscode 401 zurückgewiesen wird

Anwendung Trace (trace.axd) zeigt die folgenden als meine letzten 3 Einträge:

2 8/14/2009 1:53:56 PM /Default.aspx  200 GET View Details 
3 8/14/2009 1:54:04 PM /Default.aspx  200 POST View Details 
4 8/14/2009 1:54:13 PM /UploadHandler.ashx 401 POST View Details 

Ich habe einen Haltepunkt in meiner .ashx-Datei, aber es wird nie erreicht (ich denke, da der Statuscode 401). Hier ist der Code-Schnipsel aus dem default.aspx versucht, an den Handler POST:

protected void UploadHandlerButton_Click(object sender, EventArgs e) 
{ 
    if (FileUpload1.HasFile) 
    { 
     try 
     { 
      ASCIIEncoding encoding = new ASCIIEncoding(); 
      byte[] data = encoding.GetBytes(BuildFormData()); 
      string baseAddress = "http://" + Environment.MachineName; 
      string pathInfo = Page.ResolveUrl("UploadHandler.ashx"); 
      string URI = baseAddress + pathInfo; 
      HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI); 
      myRequest.Method = "POST"; 
      myRequest.ContentType = "application/x-www-form-urlencoded"; 
      myRequest.ContentLength = data.Length; 
      Stream newStream = myRequest.GetRequestStream(); 
      newStream.Write(data, 0, data.Length); 
      newStream.Close(); 
     } 
     catch (Exception someError) 
     { 
      LogText("FAILURE: " + someError.Message); 
     } 
    } 
} 

Hier ist ein Code-Snippet aus der UploadHandler.ashx Datei (aber das scheint nicht zu sein erreicht):

public void ProcessRequest(HttpContext context) 
    { 
     string returnURL = context.Request.ServerVariables["HTTP_REFERER"]; 
     string message; 
     message = UploadFile(context); 
     StringBuilder msgReturn = new StringBuilder(returnURL); 
     msgReturn.Append("?n="); 
     msgReturn.Append(HttpUtility.UrlEncode(TRIMrecNumAssigned)); 
     msgReturn.Append("&m="); 
     msgReturn.Append(HttpUtility.UrlEncode(message)); 
     context.Response.Redirect(msgReturn.ToString()); 
    } 

Beide default.aspx und UploadHandler.ashx in der Wurzel eines virtuellen Verzeichnisses sind auf meinem localhost; Die Verzeichnissicherheit ist derzeit auf "Anonymer Zugriff" CHECKED und "Integrierte Windows-Authentifizierung" festgelegt.

Wenn ich auf den Link "Details anzeigen" in der Anzeige "trace.axd" klicke, sehe ich alle Daten in der Forms-Sammlung, die ich sehen und verarbeiten möchte, aber diese 401 scheint alles zu stoppen. Ich könnte den Code für meine kleine Funktion BuildFormData(), wenn nützlich, veröffentlichen.

EDIT: Überarbeitete Handler wie folgt (hatte keine Wirkung, gleiche Fehler tritt auf):

public void ProcessRequest(HttpContext context) 
    { 
     //----------------------------------------------------------------------------------------- 
     // the remainder of this block is alternative to the .Redirect and is useful for debugging. 
     context.Response.ContentType = "text/html"; 
     //context.Response.Write(TRIMrecNumAssigned); 
     //context.Response.Write("<p>"); 
     //context.Response.Write(msgReturn); 
     context.Response.Write("<H1>Trim - Kerberos Prototype for ColdFusion consuming pages</h1>"); 
     HttpContext.Current.Trace.IsEnabled = true; 
     HttpContext.Current.Trace.Write(null); 
     HttpContext.Current.Trace.Write("-------"); 
     HttpContext.Current.Trace.Write(context.Request.Form["txtTrimRecordType"]); 
     HttpContext.Current.Trace.Write(GetUserInfo()); 
     HttpContext.Current.Trace.Write("-------"); 
     HttpContext.Current.Trace.Write(null); 
     using (Html32TextWriter htw = new Html32TextWriter(context.Response.Output)) 
     { 
      typeof(TraceContext) 
       .GetMethod("Render", BindingFlags.NonPublic | BindingFlags.Instance) 
       .Invoke(HttpContext.Current.Trace, new object[] { htw }); 
     } 
    } 

Antwort

0

Ein Blick auf Ihre Process(), gehen Sie wie folgt vor:

string returnURL = context.Request.ServerVariables["HTTP_REFERER"]; 

Basierend auf wie Sie rufen es mit HttpWebRequest auf, diese Variable wird null sein. Dann, wenn Sie Ihre msgReturn erstellen, ist es so etwas wie folgt aussehen:

?n=XXX%m=YYY 

Wenn Sie diese URL umleiten, wird es wahrscheinlich nicht gefunden werden, das ist das, was der Rückkehr der 401.

+0

Danke. Dein Punkt scheint gültig zu sein, aber kannst du mehr darüber sagen, warum ich nicht einmal auf der Linie stehe, die du zeigst. Das ist, warum die 401 auftritt und wie ich das beheben konnte. Ich werde mich später um die Rückkehr zum POSTER sorgen. –

+0

Was passiert beim Entfernen von context.Response.Redirect (msgReturn.ToString()) ;? – Keltex

+0

Bitte beachten Sie meine EDIT in der Frage, wo ich meine überarbeitete ProcessRequest() in der .ashx-Datei zeigen ..... trace.axd zeigt die gleichen 401 Fehler auftritt jedoch so das scheint nicht so weit zu sein. –

1

Haben Sie ist versucht drehen aus Integrierte Windows Auth und nur anonym verlassen? Macht es einen Unterschied?

Ihre Antwort: „Ich denke, es machte die Sache noch schlimmer, denn jetzt kann ich nicht einmal default.aspx sehen bekomme ich diese:. HTTP 401.3 - Zugriff von ACL auf Ressource Internet Information Services verweigert“

Meine Antwort: Das ist eigentlich eine gute Sache. Das bedeutet, dass wir uns dem, was vor sich geht, nähern. Wenn Sie diese Fehlermeldung erhalten und nur die anonyme Authentifizierung über IIS aktiviert ist, bedeutet dies, dass der ASP.NET-Identitätswechselbenutzer keine NTFS-Berechtigungen für die fraglichen Dateien besitzt.

Ich bin nicht sicher, ob Sie auf XP oder Win 2k3 sind, aber jetzt möchten Sie überprüfen, ob die Benutzer ASPNET (XP) oder Netzwerkdienst (Win 2k3) mindestens Lesezugriff auf die Dateien haben fraglich. Stellen Sie sicher, dass der Benutzer mindestens diese Zugriffsebene hat und lassen Sie mich dann wissen, wie es geht.

Update: Ich weiß nicht, warum ich vorher nicht darüber nachgedacht habe. Möglicherweise müssen Sie Anmeldeinformationen für Ihre HttpWebRequest festlegen. Wenn Sie die Anmeldeinformationen des aktuellen Benutzers verwenden möchten, fügen Sie dies Ihrer Anfrage hinzu.

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URI); 
myRequest.Credentials = CredentialCache.DefaultCredentials; 

Wenn Sie unterschiedliche Anmeldeinformationen hinzuzufügen möchten, können Sie versuchen Network Credentials

Es gibt eine good explanation of credentials here.

Hoffe, das hilft.

+0

Obwohl skeptisch (ich möchte die .ashx-Datei debuggen und ich denke, der Vstudio-Debugger erfordert Int.Win.Auth), dachte ich, ich würde Ihre Idee versuchen. Ich denke, es hat die Dinge schlimmer gemacht, weil ich jetzt nicht einmal nach default.aspx blättern kann. Ich bekomme das: HTTP 401.3 - Zugriff verweigert von ACL auf Ressource Internet Information Services –

+0

Vielen Dank für Ihre Zeit zu diesem Thema. Ich laufe auf meinem eigenen Entwickler-PC namens JOHNXP, der XP und IIS 5.1 ausführt. Das virtuelle Verzeichnis wird HTTPHandleTRIM genannt, die dem lokalen Pfad verweist: C: \ Dokumente und Einstellungen \ johna \ Eigene Dateien \ Visual Studio 2005 \ Projects \ HandlersTRIM Zuerst habe ich JOHNXP \ ASPNET den obigen Ordner HandlersTRIM und gab es Berechtigungen für "Lesen & Ausführen", "Ordner auflisten" und "Lesen". Dann mit Anonymer aktiviert AND Integrated Windows Auth auch überprüft, ich habe das gleiche Ergebnis (ein 401 versucht, UploadHandler.ashx POST). Als nächstes habe ich "Integrierte Windows Auth" UNCHECKED. (Forts.) –

+0

Mit "IWA" deaktiviert, war ich nicht einmal in der Lage, zu meiner default.aspx-Seite zu navigieren. Also habe ich IUSR_JOHNXP hinzugefügt und dem anonymen Benutzer die gleichen Berechtigungen wie oben gegeben ("Lesen & Ausführen", etc.). Jetzt anstelle von 401 bekomme ich eine 302. Gibt es eine Möglichkeit, detailliertere Ursachencodes oder Unterstatuscodes für diese Fehler zu bekommen? –