2009-07-09 2 views
0

Actuellement, je travaille sur un bout de projet. Au cours du projet, je dois être en mesure de mettre un message sur un serveur à partir d'un serveur Web, puis à partir d'un iPhone Demander au serveur de lire le message.Problèmes avec une méthode Web ASMX utilisant des E/S de fichier

Alors que tous les peices individuels travaillent et ma demande va par l'amende, je ne parviens pas à utiliser ce webmethod

[WebMethod()] 
public void setMessage(string message) 
{ 
    FileStream file = new FileStream("mymessage.txt", FileMode.OpenOrCreate, FileAccess.Write); 
    StreamWriter sw = new StreamWriter(file); 
    sw.Write(message); 
    sw.Close(); 
    file.Close(); 
} 

Quand j'invoque ce message via HTTP en utilisant SOAP d'une application iPhone.

Je reçois le xml suivant dans ma console lorsque je fais la demande.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<soap:Body> 
<soap:Fault> 
<faultcode>soap:Server</faultcode> 
<faultstring>Server was unable to process request. ---&gt; Access to the path 'c:\windows\system32\inetsrv\myMessage.txt' is denied.</faultstring> 
<detail /> 
</soap:Fault> 
</soap:Body> 
</soap:Envelope> 

Le serveur est configuré par un mon patron, qui est actuellement utilisé dans d'autres capacités en tant que serveur de test dans la maison pour plusieurs projets différents.

Le serveur est un serveur IIS Je ne sais pas quelle version, avec ASP.NET configuré et installé.

Le script est situé à un endroit différent de celui que le programme essaie d'écrire. Je suppose que le script est exécuté à partir de ce répertoire et c'est pourquoi il essaie d'écrire là. Est-ce le cas ou ai-je oublié quelque chose de fondamental?

S'il y a d'autres suggestions quant à la façon dont je pourrais faire cela, j'aimerais les entendre aussi, car je travaille sur une base de connaissances assez petite.

Merci!

+0

Quelle est votre question? Quelle partie n'avez-vous pas compris? –

+0

Si vous souhaitez écrire quelque part en dehors de l'application, vous devez spécifier le chemin d'accès complet à ce fichier. Si ce fichier se trouve sous le répertoire de votre application, vous pouvez utiliser 'Server.MapPath' pour convertir un chemin virtuel si vous le souhaitez (ou spécifier le chemin manuellement, rien ne vous empêche de le faire). Dans les deux cas, le compte d'utilisateur sous lequel l'application ASP.NET est exécutée doit avoir une autorisation en écriture sur cet emplacement. –

Répondre

4

Change « filename.txt » à

Server.MapPath("filename.txt") 

ou spécifier le chemin physique complet du fichier et accorder des autorisations NTFS à l'utilisateur ASP.NET pour pouvoir accéder au dossier.

Server.MapPath convertit les chemins virtuels (par exemple ~/helloworld.aspx) en chemins physiques (par exemple D:\WebSite\helloworld.aspx).

1

En plus de stocker le fichier dans un dossier que vous avez accès (avez-vous été incapable de lire le message?), Vous devez implémenter correctement « en utilisant » blocs:

using (FileStream file = new FileStream("mymessage.txt", 
        FileMode.OpenOrCreate, FileAccess.Write)) { 
    using (StreamWriter sw = new StreamWriter(file)) { 
     sw.Write(message); 
    } 
} 

La raison il écrit à c: \ windows \ system32 \ inetsrv \ c'est que c'est son répertoire par défaut. Si vous voulez écrire dans un répertoire différent, vous devez le spécifier. Server.MapPath le fera, comme cela vous a déjà été signalé.

Questions connexes