Невозможно загрузить изображение с помощью WCF - PullRequest
0 голосов
/ 09 января 2020

Я разрабатываю пример приложения Xamarin.Forms, которое делает фотографию и после этого загружает ее на удаленный сервер. Часть загрузки обрабатывается службой WCF, развернутой на удаленном IIS.

Клиентская часть в порядке, но когда поток достигает серверной части, я получаю эту ошибку:

System. Net .WebException: при обработке веб-запроса произошла ошибка: код состояния 413 (RequestEntityTooLarge): слишком большой объект Entity Request

Я пытался увеличить максимальный размер сообщения, оба в WCF web.config и на сайте, где развернута служба.

Ниже web.config службы:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="GlobalEndpoint">
          <dataContractSerializer maxItemsInObjectGraph="1365536" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="GlobalBehavior">
      <dataContractSerializer maxItemsInObjectGraph="1365536" />
    </behavior>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>       
        <binding
          name="BasicHttpBinding_IQuery_service"
          maxBufferPoolSize="2147483647"
          maxReceivedMessageSize="2147483647"
          maxBufferSize="2147483647" 
          transferMode="Streamed">
          <readerQuotas maxDepth="2000000" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        </binding>       
      </basicHttpBinding>     
    </bindings>
    <client>
      <endpoint address="http://path/to/service.svc"
          binding="webHttpBinding" bindingConfiguration="BasicHttpBinding_IQuery_service"
          contract="IQuery_service" name="BasicHttpBinding_IQuery_service" />
    </client>
    <protocolMapping>
        <add binding="webHttpBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
    <directoryBrowse enabled="true" />
  </system.webServer>

Под настройками редактора конфигурации сайта, на котором развернута служба WCF:

enter image description here

Ниже приведен метод, который я вызываю для загрузки изображения:

public bool UploadToFolder(byte[] file_bytes, string file_name)
        {
            bool isSuccess = false;
            FileStream fileStream = null;
            //Get the file upload path store in web services web.config file.  
            string strFolderPath = System.Configuration.ConfigurationManager.AppSettings.Get(@"dest\path");
            try
            {
                if (!string.IsNullOrEmpty(strFolderPath))
                {
                    if (!string.IsNullOrEmpty(file_name))
                    {
                        string strFileFullPath = strFolderPath + file_name;
                        fileStream = new FileStream(strFileFullPath, FileMode.OpenOrCreate, FileAccess.ReadWrite);
                        // write file stream into the specified file  
                        using (System.IO.FileStream fs = fileStream)
                        {
                            fs.Write(file_bytes, 0, file_bytes.Length);
                            isSuccess = true;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return isSuccess;
        }

Я не знаю Если это лучший способ выполнить загрузку на удаленный сервер из приложения Xamarin, приветствуются любые предложения.

РЕДАКТИРОВАТЬ

Уже пытались увеличить maxReceivedMessageSize в сети .config, безуспешно.

Как я читаю На главной странице сервиса я запускаю команду svcutil.exe http://server_address/path/to/service.svc?wdsl, после чего я добавляю file.cs в свое решение и из этого вызываю методы varius.

Часть кода, где я вызываю метод загрузки:

try
{       
    Query_serviceClient client = new Query_serviceClient(http_binding, endpoint_address);
    client.UploadToTempFolder(filebyte, filename);
    client.Close();
}
catch (Exception ex)
{
    DisplayAlert("ERROR", ex.ToString(), "OK");
}  

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Решение состоит в том, чтобы изменить метод загрузки.

Итак, чтобы загрузить изображение, я использую это простое и чистое решение:

public void UploadFile(Stream file_stream)
        {
            using (var output = File.Open("dest/for/image.jpg", FileMode.Create, FileAccess.ReadWrite))
            {
                file_stream.CopyTo(output);
            }
        }
0 голосов
/ 10 января 2020

Прежде чем ответить на вопрос, мы должны выяснить, как вы вызываете службу WCF. Это определило, каким образом вы хотите вызвать службу, а затем применить конфигурацию к нужной службе (Soap веб-служба или стиль отдыха).
В соответствии с приведенной выше конфигурацией службы, размещение службы в IIS недопустимо, а именно, служба WCF работает неправильно, не говоря уже о том, что произошла ошибка при вызове. Если мы попытались получить доступ к услуге WSDL, мы увидим подробности ошибки. Используете ли вы клиентский прокси для загрузки изображения или непосредственно создаете экземпляр класса HttpClient для создания запроса на отправку по адресу конечной точки службы?
Если вы выбрали первый способ загрузки изображения, обратитесь к приведенной ниже конфигурации .

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding
          name="mybinding"
          maxReceivedMessageSize="2147483647">
        </binding>
      </basicHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http" bindingConfiguration="mybinding"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Если вы хотите создать службу WCF в стиле Restful, т.е. второй вариант, обратитесь к приведенной ниже конфигурации.

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="rest" maxReceivedMessageSize="2147483647">
        </binding>
      </webHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" bindingConfiguration="rest"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Не стесняйтесь сообщить мне, если проблема все еще существует.

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