Я разрабатываю пример приложения 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:
Ниже приведен метод, который я вызываю для загрузки изображения:
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");
}