2011-08-24 53 views
9

Mi aplicación utiliza el método "Poner" HttpWebRequest para cargar archivos en las aplicaciones asp.net alojadas en iis7. Tuve un error Código de estado 405 Método no permitido. He intentado con todas las soluciones que puedo encontrar en el foro durante 2 días, incluida la eliminación de webDav en los controladores, agregando el método "Poner" en los controladores (como se encuentra en http://blogs.msdn.com/b/joseph_fultz/archive/2009/07/23/enabling-the-put-verb-with-handlers-and-iis-7-0.aspx), volver a registrar asp.net en iis. Pero ninguna de las soluciones funciona en mi caso.HTTPWebRequest Estado de error "PUT" 405 Método no permitido en IIS7

corro Failed seguimiento de solicitudes en IIS, y por debajo es el error:

MODULE_SET_RESPONSE_ERROR_STATUS 
ModuleName StaticFileModule 
Notification 128 
HttpStatus 405 
HttpReason Method Not Allowed 
HttpSubStatus 0 
ErrorCode 2147942401 
ConfigExceptionInfo  
Notification EXECUTE_REQUEST_HANDLER 
ErrorCode Incorrect function. (0x80070001) 
    MODULE_SET_RESPONSE_ERROR_STATUS 
Warning  

ModuleName="StaticFileModule", Notification="EXECUTE_REQUEST_HANDLER", HttpStatus="405", HttpReason="Method Not Allowed", HttpSubStatus="0", ErrorCode="Incorrect function 

Cualquier ayuda es muy apreciada. Gracias. Mi asp.net aplicaciones/formulario fue desarrollado usando Visual Studio 2008 y publicado en iis 7.

-------------------------- ------------- ACTUALIZACIÓN

El código para manejar HttpWebRequest (PUT) está debajo: Tomó el token de autenticación de usuario y lo verificó. Después de eso, creó un ticket de autenticación y respuesta para el usuario.

 tokenSignature = false; 

     //To capture the tokenId 
     string MainString = Request.Headers.ToString(); 
     int FirstChr = MainString.IndexOf("*="); 
     MainString = MainString.Substring(FirstChr + 2); 
     int secondChr = MainString.IndexOf("%"); 
     tokenId = MainString.Substring(0, secondChr); 


     //to Write the received encrypted token into temporary folder 
     FileStream fs = new FileStream(AppsConfig.temp + tokenId, FileMode.Create); 
     BinaryWriter bw = new BinaryWriter(fs); 

     //Convert the listenerRequest into InputStream to write the token 
     Stream InputStream = Request.InputStream; 
     byte[] inData = new byte[32768]; 
     int bytesRead; 

     while ((bytesRead = InputStream.Read(inData, 0, inData.Length)) > 0) 
     { 
      bw.Write(inData, 0, bytesRead); 
     } 

     //close the connection that is used to write the token 
     bw.Close(); 
     fs.Close(); 

     //Read the temporary encrypted token (for decryption purposes) 
     fin = File.OpenRead(AppsConfig.temp + tokenId); 

     //To read the private key 
     Stream prSignKey = File.OpenRead(AppsConfig.privateKey); 
     PgpSecretKey pgpSec; 
     PgpSecretKeyRingBundle ringBundle = new PgpSecretKeyRingBundle(PgpUtilities.GetDecoderStream(prSignKey)); 

     //Get the company key Id and passphrase 
     String[] getText = new String[2]; 
     int no = 0; 
     TextReader readFile = new StreamReader(AppsConfig.keyFile); 

     do 
     { 
      getText[no] = readFile.ReadLine(); 
      no++; 
     } while (no < 2); 
     readFile.Close(); 
     long KeyId = Int64.Parse(getText[0]); 
     Char[] passwd = getText[1].ToCharArray(); 
     //Get the private key 
     pgpSec = ringBundle.GetSecretKey(KeyId); 
     PgpPrivateKey pgpPrivate = pgpSec.ExtractPrivateKey(passwd); 

     //Close all unnecessary connections 
     InputStream.Close(); 
     prSignKey.Close(); 
     readFile.Close(); 

     //Call the decrypt method to decrypt the token 
     decryptFile(fin, pgpPrivate, "original.xml", tokenId); 

     if (tokenSignature == true) 
     { 
      //Create the authentication cookie and add this cookie to the httpResponse 
      //This authentication cookie would be used to access the resource.aspx 
      HttpCookieCollection cc = Response.Cookies; 
      FormsAuthentication.SetAuthCookie(tokenId, false); 
      cc = Response.Cookies; 

     //remove the temporary file that was created earlier. 
      File.Delete(AppsConfig.temp + tokenId); 
      File.Delete(AppsConfig.temp + tokenId + ".bin"); 
     } 
     else 
     { 
      Server.Transfer("~/Error.aspx?errorMessage=" + "SignatureFailed"); 

     } 
+0

por favor muestre un código fuente ... esp. el "objetivo" en su aplicación asp.net que maneja la solicitud PUT ... – Yahia

Respuesta

1

No creo que el problema está en su código ... si no se permite el verbo PUT, ningún cliente va a ser capaz de poner los archivos. Tampoco está diciendo "No autorizado", que sería el caso si se tratara de un problema de permisos ... Creo que sigue siendo uno de configuración de IIS. Compruebe hacia fuera este enlace:

http://support.microsoft.com/kb/942051/en-us

Para hacer las cosas más simples en sí mismo, es posible que echa un vistazo a esta herramienta que he oído es buena para estas cosas:

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=21625

HTH.

+0

Como mencionó, el problema no está en mi código ya que puedo hacerlo funcionar en la máquina de desarrollo con el sistema de archivos asp.net . Solo cuando se publica en iis aparece el problema. Intenté tus sugerencias, pero no tuve suerte hasta ahora. – iLoeng

+0

Ambos enlaces están rotos, solo para su información. – ketura

13

Hay un par de rutas también solucionar este problema:

1) Desinstalar WebDAV desde el servidor por completo. Puede hacer esto desde la aplicación de funciones Agregar o quitar de Windows. Esto requerirá un reinicio.

2) La segunda solución es simple. A) Vaya al sitio de IIS y haga clic en los módulos. Encuentra el módulo WebDAV y quítalo.

Ahora todavía puede usar WebDAV en sus otros sitios y no interferir con el método PUT en este sitio.

enter image description here

B) Es posible que necesite para encontrar la correcta asignación de controlador y añadir el verbo PUT.

+0

Funcionó como un amuleto, gracias. – Doug

+0

funcionó para mí :) – GreyCloud

Cuestiones relacionadas