2010-06-25 11 views
3

je veux POST des données de formulaire à la page par défaut d'un serveur Web, par exemple:IIS: 405 (Méthode non autorisée) lors de la publication par défaut la page

POST http://errorreporting.example.com/ HTTP/1.1 

je veux que le serveur soit responsable de 302 rediriger le client à l'endroit où le POST devrait aller. Le fichier default.asp sur le serveur exécute cette tâche (which is the technique Microsoft recommends), en effectuant la Redirect:

default.asp:

<% 
    Response.Redirect "SubmitError.ashx" 
%> 

Quand je simplement parcourir le serveur:

GET http://errorreporting.example.com/ HTTP/1.1 

je reçois la réponse attendue du serveur:

HTTP/1.1 302 Object moved 
Server: Microsoft-IIS/5.0 
Location: SubmitError.ashx 
... 

Mais quand je POST au serveur:

POST http://errorreporting.example.com/ HTTP/1.1 

Le serveur devient très grincheux avec moi:

HTTP/1.1 405 Method not allowed 
Connection: close 
Allow: OPTIONS, TRACE, GET, HEAD 
... 

Je veux que le serveur pour pouvoir rediriger le client à la soumission appropriée URL, plutôt que de coder en dur le client avec le URL. Ceci est, bien sûr, parce que l'URL pourrait (à savoir a) changé:

  • http://errorreporting.example.com/SubmitError.asp
  • http://errorreporting.example.com/SubmitError.aspx
  • http://errorreporting.example.com/SubmitError.ashx
  • http://errorreporting.example.com/ErrorReporting/Submit.ashx
  • http://errorreporting.example.com/submiterror.php
  • http://errorreporting.example.com/submit/submiterror.ashx

etc.

Remarque: Si je change le URL pour inclure l'emplacement du document:

/* SErrorReportingUrl = 'http://www.example.com:8088/ErrorReporting/SubmitError.ashx'; 
    SErrorReportingUrl = 'http://www.example.com/ErrorReporting/SubmitError.ashx'; 
    SErrorReportingUrl = 'http://errorreporting.example.com:8088/ErrorReporting/SubmitError.ashx'; 
    SErrorReportingUrl = 'http://errorreporting.example.com/SubmitError.ashx'; 
    SErrorReportingUrl = 'http://errorreporting.example.com'; 
    SErrorReportingUrl = 'http://errorreporting.example.com/SubmitError.ashx'; 
*/ 
    SErrorReportingUrl = 'http://errorreporting.example.com/submit/SubmitError.ashx'; 

Il fonctionne très bien:

HTTP/1.1 200 OK 

Répondre

2

s'avère obtenir IIS pour soutenir POST ne fonctionne pas vraiment aider. J'utilise XMLHttpRequest pour effectuer le POST s. Presque toutes les implémentations de XMLHttpRequest (par exemple, Chrome, Internet Explorer, MSXML) ont un bug où elles exécutent un GET, au lieu d'un POST, après avoir suivi la redirection.

Le W3C's XMLHttpReqest specification dit redirigeant doivent être suivies et les demandes réédités:

Si la réponse est une redirection HTTP:

Si la redirection ne viole pas la sécurité (il est same origin par exemple), précautions de boucle infinie, et le schéma est pris en charge, de manière transparente suivre la redirection tout en observant le same-origin request event rules.

Remarque: HTTP implique des exigences de l'utilisateur un agent en ce qui concerne la préservation de la request method et request entity body pendant réoriente, et aussi exige que les utilisateurs finaux soient informés de certains types de automatique redirections.

Et here's a site où vous pouvez tester le bogue dans XmlHttpRequest la mise en œuvre de votre navigateur.


En fin de compte, je vais travailler autour d'un IIS bug, et un bug XMLHttpRequest, en ayant ma page "par défaut" faire tout ce qu'un 302 redirect serait, mais revenir 200 OK à la place:

HTTP/1.1200 OK
Connection: close
Date: Sun, 27 Jun 2010 13:28:14 GMT
Server: Microsoft-IIS/6.0
Location: http://errorreporting.example.com/submit/SubmitError.ashx
Content-Length: 92
Content-Type: text/html
Cache-control: private

<HTML><BODY>This content has moved <A href="submit/SubmitError.ashx">here.</A></BODY></HTML> 

je suis forcer le client à faire deux coups sûrs en tout cas - pourrait tout aussi bien le faire fonctionner à droite.

Questions connexes