Самостоятельный веб-сервис С#: невозможно загружать файлы размером более 60 тыс.

В моем собственном веб-сервисе у меня есть метод сервера для получения загруженного изображения:

[System.ServiceModel.OperationContract, WebInvoke(UriTemplate = "MalaDireta/saveImage")]
string MD_saveImage(Stream arq);

public string MD_saveImage(Stream img) {
        try {
            Image i = Image.FromStream(img);

            //Here I just show received image in a PictureBox
            new ImageTest(i).ShowDialog();
        }
        catch (Exception ex) {
            MessageBox.Show("Exception:\n" + ex.ToString());
        }
        return "test";
}

Со следующим файлом App.config:

<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<bindings>
</bindings>
<services>
  <service name="WebService.RestService" behaviorConfiguration="Default">
    <host>
      <baseAddresses>
      </baseAddresses>
    </host>
    <endpoint address="" binding="webHttpBinding" behaviorConfiguration="webBehavior" contract="WebService.ICarga"></endpoint>
  </service>
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="webBehavior">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="Default">
      <serviceMetadata httpGetEnabled="true"/>
      <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>
  </serviceBehaviors>
</behaviors>
</system.serviceModel>
<startup>
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>

И следующий метод клиента для загрузки изображения (у клиента нет App.config):

    Image img = Image.FromFile("fileName");
    MemoryStream ms = new MemoryStream();
    img.Save(ms, ImageFormat.Png);

    Uri uri = new Uri("http://m.y.i.p:port/MalaDireta/saveImage");

    WebClient client = new WebClient();
    ms.Position = 0;
    try {
        client.UploadData(uri, ms.ToArray());
    }
    catch (Exception exc) {
        MessageBox.Show("Error at insertion.\n Exception: " + exc.ToString());
    }

И это прекрасно работает, если размер изображения не превышает 60 КБ. В противном случае я получаю «Ошибка 400: неверный запрос», и в этом случае метод сервера даже не запускается (я пробовал с MessageBox в начале метода). Я безуспешно пытался изменить некоторые вещи в сервере App.Config (вероятно, из-за моего непонимания файла конфигурации). Подскажите, пожалуйста, как можно загружать большие файлы?

Заранее спасибо.


person jRicardo    schedule 24.02.2014    source источник
comment
Это должно помочь, этот пример - wcf, но для того, что вы пытаетесь выполнить, должна быть аналогичная привязка. stackoverflow.com/questions/884235 /   -  person vikingben    schedule 24.02.2014
comment
Спасибо, @vikingben. Но все еще дает мне ту же ошибку.   -  person jRicardo    schedule 24.02.2014
comment
Еще что выкину туда. У меня была аналогичная проблема, с которой я боролся при загрузке изображений веб-службой wcf, и прошла неделя, прежде чем я обнаружил, что ошибка не на стороне веб-службы, но мне пришлось изменить конфигурацию в клиентском приложении. Может стоит попробовать. Я использовал то же самое для максимального сообщения в app.config привязки. Удачи.   -  person vikingben    schedule 24.02.2014
comment
Еще раз спасибо, @vikingben. Вы знаете, где я могу найти пример файла конфигурации клиента? Никогда раньше им не пользовался, а тот, что на моем сервере, — это просто немного измененный пример, который я нашел.   -  person jRicardo    schedule 24.02.2014
comment
@vikingben Я нашел пример клиентского App.config. Он использует адрес сервера в теге конечной точки. Но мне нужно определить адрес сервера в методе webclient.uploadData. Как веб-клиент будет использовать App.config?   -  person jRicardo    schedule 25.02.2014
comment
Если вы щелкнете правой кнопкой мыши свой клиентский проект и добавите туда ссылку на службу, вы должны щелкнуть вперед, что позволит вам добавить веб-ссылку, это создаст привязку в вашем app.config. Оказавшись там, вы можете ссылаться на этот объект в своем коде С#. Как бы вы ни назвали эту ссылку, вы сможете использовать ее для вызова службы вместо веб-клиента.   -  person vikingben    schedule 25.02.2014
comment
@vikingben, к сожалению, я почему-то не могу добавить свой веб-сервис в качестве ссылки. Он работает в браузерах, но всегда говорит об ошибке 404 или Error 405 в Visual Studio...   -  person jRicardo    schedule 25.02.2014
comment
давайте продолжим это обсуждение в чате   -  person vikingben    schedule 25.02.2014


Ответы (1)


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

http://msdn.microsoft.com/en-us/library/ms731361.aspx

person Omer Faruk Zorlu    schedule 24.02.2014
comment
Спасибо за ответ. Но я уже пытался изменить на maxReceivedMessageSize=2000000000 maxBufferSize=2000000000 maxBufferPoolSize=2000000000 и все равно не повезло, выдавая ту же ошибку 400: Bad Request - person jRicardo; 24.02.2014