WCF problème avec le téléchargement d'un fichier volumineux, hébergé dans IIS
Je suis en train de télécharger de gros fichiers à un Service WCF hébergé dans IIS.
Je suis avec calme et méthode de diffusion.
Mais je ne suis pas capable de télécharger des fichiers qui est plus de 64 ko.
J'ai essayé beaucoup en changeant tous les liés à la taille des éléments dans web.config
fichier, mais a échoué à résoudre le problème.
Voici mon code et de configuration, s'il vous plaît laissez-moi savoir si quelqu'un à trouver des problèmes dans le code et comment puis-je réparer.
Contrat D'Opération
[OperationContract]
[WebInvoke(UriTemplate = "/UploadImage/{filename}")]
bool UploadImage(string filename, Stream image);
Mise en œuvre de Contrat d'Opération
public bool UploadImage(string filename, Stream image)
{
try
{
string strFileName = ConfigurationManager.AppSettings["UploadDrectory"].ToString() + filename;
FileStream fileStream = null;
using (fileStream = new FileStream(strFileName, FileMode.Create, FileAccess.Write, FileShare.None))
{
const int bufferLen = 1024;
byte[] buffer = new byte[bufferLen];
int count = 0;
while ((count = image.Read(buffer, 0, bufferLen)) > 0)
{
fileStream.Write(buffer, 0, count);
}
fileStream.Close();
image.Close();
}
return true;
}
catch (Exception ex)
{
return false;
}
}
web.config
<system.serviceModel>
<services>
<service name="Service" behaviorConfiguration="ServiceBehavior">
<endpoint address="http://localhost/WCFService1" behaviorConfiguration="web"
binding="webHttpBinding" bindingConfiguration="webBinding"
contract="IService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<webHttpBinding>
<binding name="webBinding"
transferMode="Streamed"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
openTimeout="00:25:00" closeTimeout="00:25:00" sendTimeout="00:25:00"
receiveTimeout="00:25:00" >
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
et
<httpRuntime maxRequestLength="2097151"/>
Service est hébergé dans hébergés dans IIS
Code côté Client (application console)
private static void UploadImage()
{
string filePath = @"F:\Sharath\TestImage\TextFiles\SampleText2.txt";
string filename = Path.GetFileName(filePath);
string url = "http://localhost/WCFService1/Service.svc/";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url + "UploadImage/" + filename);
request.Accept = "text/xml";
request.Method = "POST";
request.ContentType = "txt/plain";
FileStream fst = File.Open(filePath, FileMode.Open);
long imgLn = fst.Length;
fst.Close();
request.ContentLength = imgLn;
using (Stream fileStream = File.OpenRead(filePath))
using (Stream requestStream = request.GetRequestStream())
{
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int byteCount = 0;
while ((byteCount = fileStream.Read(buffer, 0, bufferSize)) > 0)
{
requestStream.Write(buffer, 0, byteCount);
}
}
string result;
using (WebResponse response = request.GetResponse())
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
result = reader.ReadToEnd();
}
Console.WriteLine(result);
}
Avec beaucoup de code, je suis en mesure de télécharger des 64 ko de fichier, mais lorsque je tente de télécharger un fichier de plus de 64 ko à la taille, j'obtiens le message d'erreur tel que,
The remote server returned an error: (400) Bad Request
j'ai fait ce que vous avez dit mais j'ai toujours se même problème, c'est comment ma config ressemble maintenant, pouvez-vous s'il vous plaît dites-moi ce qui manque encore ici
<services>
<service name="Service" behaviorConfiguration="ServiceBehavior">
<endpoint address="http://localhost/WCFService1" behaviorConfiguration="web"
binding="webHttpBinding" bindingConfiguration="webBinding"
contract="IService">
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<webHttpBinding>
<binding transferMode="Streamed"
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
openTimeout="00:25:00" closeTimeout="00:25:00" sendTimeout="00:25:00" receiveTimeout="00:25:00"
name="webBinding">
<readerQuotas maxDepth="64"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647"/>
</binding>
</webHttpBinding>
</bindings>
toute solution finale avec l'intégralité du code source de l'échantillon de travail à ce sujet ?
OriginalL'auteur Sharath | 2011-06-11
Vous devez vous connecter pour publier un commentaire.
Le transfert de données volumineuses problème avec wcf:
J'ai wcf 4.0 service hébergé sur IIS 7, windows 2008 server. Lorsque j'appelle le service de données de petite taille-dire 4K ou 5K octets alors demander à être traités facilement, mais tout en essayant de télécharger de gros de la taille, il m'a donné suite à des erreurs de
Dans tous les caseses j'ai été capable de transférer des données de faible demande avec mon application client serveur, mais pour la grande taille de message. Échec de la demande.
J'ai essayé toutes les méthodes disponibles pour résoudre ce problème mais rien n'a fonctionné pour moi.
Après une me gratter la tête pendant une semaine et la lecture de tous les articles et les blogs, enfin, j'ai pensé suivantes
Donc je pense que Ça peut aider quelqu'un à jours....
La seule information à gauche: le nom du service devrait être sous la forme de "YourNamespace.Classname" de la .svc fichier. Je vous remercie pour l'affichage de ces informations.
ne sais pas comment vous remercier.. moi aussi j'avais le même problème.. maintenant il fonctionne comme un charme
OMG vous avez sauvé ma journée avec votre réponse. Merci beaucoup!!!
Sont le système.web et le système.serveur les paramètres applicables à un Windows Forms application reposant, n'importe qui? Je fais également les transferts de fichiers volumineux, mais à l'aide de Windows Forms Application
OriginalL'auteur WaseemM
Fonction de la taille mentionnée par vous, il semble que l'erreur due à la limite de frapper à la liaison de niveau c'est à dire readerQuota valeurs. Vous pouvez vérifier si le déni de serveur est due à un dépassement de la limite au niveau de la liaison par la capture de la WCF traces. Nous ne pouvons pas voir la configuration que vous avez posté, donner notre meilleure estimation, besed sur l'information qui est visible.
J'avais capture WCF des traces au niveau de verbosité pour résoudre le problème.
Btw, avez-vous tenté d'augmenter le maxRequestLength?
http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.maxrequestlength.aspx
HTH,
Amit Bhatia
OriginalL'auteur amit
ce qui fixe 404 taille du message trop gros problème pour moi a été une partie de WaseemM exemple:
OriginalL'auteur tridy
Voir...tous ceux qui sont confrontés à ce problème de 64 KO télécharger truc manquantes, très simple à base de points. Nous sommes des valeurs élevées pour maxAllowedContentLength, maxReceivedMessageSize...bla bla mais toujours rien ne fonctionne :). Il nous manque à tous la très de base, point...et bien j'avais au moins) n'est pas une question quelle que soit la configuration de liaison que nous avons défini, n'importe où en sommes-nous de mentionner que notre point de TERMINAISON DOIT SUIVRE LA LIAISON CONFIG????...pas le cas...Donc en gros on doit laisser le EXTRÉMITÉ sais qu'il doit suivre notre LIAISON CONFIG.
OriginalL'auteur Chandrachur
Si le transfert de données de grande taille est si votre tâche, vous devez utiliser MTOM. Il suffit de chercher "MTOM WCF".
OriginalL'auteur Gilad
Chandrachur est correct, ce que vous indiquez dans votre
<binding/>
ou<readerQuotas/>
, vous devez ajouter"bindingConfiguration="my binding config name"
dans votre<endpoint/>
. Autrement ça ne fonctionnera pas, même si votre liaison config est correcte. vous devez vous assurer que vos configs sont appliqués à votre point de terminaison. pour ce faire, vous avez besoin"bindingConfiguration"
réglé correctement.OriginalL'auteur user4360707