Проблема WCF с загрузкой большого файла, размещенного в IIS - PullRequest
7 голосов
/ 11 июня 2011

Я пытаюсь загрузить большие файлы в службу WCF, размещенную в IIS.

Я использую метод Restful и Streaming.

Но я не могу загрузить файлы, размер которых превышает64 КБ.

Я много пробовал, изменив все связанные с размером элементы в файле web.config, но не смог решить проблему.

Вот мой код и конфигурация, пожалуйста, дайте мне знать, еслиКто-нибудь найдет какие-либо проблемы в коде и как я могу их исправить.

Операционный контракт

[OperationContract]
[WebInvoke(UriTemplate = "/UploadImage/{filename}")]
bool UploadImage(string filename, Stream image);

Реализация Операционного контракта

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>

и

<httpRuntime maxRequestLength="2097151"/>

Служба размещена в IIS

Код на стороне клиента (консольное приложение)

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);
}

С этим большим количеством кода я могу загрузить 64 КБ файла, но когда я пытаюсь загрузить файл размером более 64 КБ, я получаю сообщение об ошибке типа

The remote server returned an error: (400) Bad Request


я сделал то, что вы сказали, но все равно у меня та же проблема, вот так выглядит мой конфигкак сейчас, подскажите, пожалуйста, чего здесь еще не хватает

<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>

Ответы [ 6 ]

23 голосов
/ 02 августа 2011

Большая проблема передачи данных с wcf:

У меня есть служба wcf 4.0, размещенная на IIS 7, Windows 2008 Server.Когда я вызываю свой сервис с небольшими данными, скажем, 4K или 5K байтов, тогда запрос обрабатывается легко, но при попытке загрузить большой размер он выдает мне следующие ошибки

  1. Bad Request 400
  2. Файл ненайдено 404 13, как видно из журналов IIS 7
  3. Нет конечной точки, прослушивающей службу "myservice url"

Во всех случаях мне удалось передать небольшой запрос данных с помощью моегоклиентское приложение к серверу, но для сообщения большого размера.Запрос не выполнен.

Я перепробовал все доступные методы для решения этой проблемы, но у меня ничего не получилось.

После недолгого расчесывания головы и прочтения всех статей и блогов, наконец, я понял, что следующее

<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
        <binding name="myBinding" closeTimeout="00:10:00" maxBufferPoolSize="250000000" maxReceivedMessageSize="250000000" openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" messageEncoding="Text">
        <readerQuotas maxDepth="4500000" maxStringContentLength="4500000" maxBytesPerRead="40960000" maxNameTableCharCount="250000000" maxArrayLength="4500000"/>
            </basicHttpBinding>
        </bindings>
    </system.serviceModel>
</configuration>



<system.web>

    <httpRuntime executionTimeout="4800" maxRequestLength="500000000"/>
</system.web>

<system.webServer>
        <security>
            <requestFiltering>
                <requestLimits maxAllowedContentLength="500000000"></requestLimits>
            </requestFiltering>
        </security>
</system.webServer>

<!-- other useful setting -->

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

Так что я думаю, что это может помочь кому-то дни ....

2 голосов
/ 27 июня 2014

то, что исправило размер сообщения 404, слишком большая проблема для меня, было частью примера WaseemM:

<system.webServer>
    <security>
        <requestFiltering>
            <requestLimits maxAllowedContentLength="500000000"></requestLimits>
        </requestFiltering>
    </security>
2 голосов
/ 11 июня 2011

Исходя из упомянутого вами размера, кажется, что ошибка из-за ограничения на уровне привязки, то есть значения readerQuota. Вы можете подтвердить, что отказ сервера связан с превышением лимита на уровне привязки, путем захвата трассировок WCF. Мы не можем видеть конфигурацию, которую вы опубликовали, поэтому мы даем наилучшую оценку информации, которая видна.

Я бы собирал трассировки WCF на подробном уровне для устранения проблемы.

Кстати, вы пытались увеличить maxRequestLength? http://msdn.microsoft.com/en-us/library/system.web.configuration.httpruntimesection.maxrequestlength.aspx

НТН, Амит Бхатия

1 голос
/ 16 сентября 2014

Понимаете ... все мы, кто сталкивается с проблемой 64KB загрузки, упускают из виду основную идею. Мы устанавливаем высокие значения для maxAllowedContentLength, maxReceivedMessageSize ... бла-бла, но все равно ничего не работает :). Мы все упускаем самую основную мысль (ну, по крайней мере, так было), независимо от того, какую конфигурацию привязки мы установили, мы где-нибудь упоминаем, что наш ENDPOINT ДОЛЖЕН СЛЕДУЕТ ЗА КОНФИГОМ СВЯЗИ ???? .. .no где ... Итак, в основном мы должны сообщить ENDPOINT , что оно должно следовать нашему BINDING CONFIG .

<endpoint address="" 
 binding="webHttpBinding" 
 behaviorConfiguration="Your behaviour config name"
 bindingConfiguration="YOUR BINDING CONFIG NAME"
 contract="Your contract service"  />
0 голосов
/ 15 декабря 2014

Чандрахур верен, что бы вы ни указали в <binding/> или <readerQuotas/>, вам нужно добавить "bindingConfiguration="my binding config name" в <endpoint/>.В противном случае он не будет работать, даже если ваш конфиг привязки правильныйвам нужно убедиться, что ваши конфиги применены к вашей конечной точке.для этого вам нужно "bindingConfiguration" установить правильно.

0 голосов
/ 12 июня 2011

Если передача больших данных - это если ваша задача, вы должны использовать MTOM.Просто найдите "MTOM WCF".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...