Конечная точка обслуживания WCF не запускается при передаче изображения по определенному размеру

69
6

РЕЗЮМЕ: Когда изображение превышает определенный размер, конечная точка в моей службе REST никогда не запускается.

Отказ от ответственности: я посмотрел, что каждый пост в StackOverflow и google по этому вопросу относится к этой теме. Ничего, что я пробовал, сработало.

Я подозреваю, что мне не хватает чего-то из-за чистого невежества. Я относительно новичок в WCF.

Я установил следующее:

REST, которая предоставляет множество конечных точек для поддержки обработки изображений. Все отправляется/возвращается как JSON

Вот копия моего web.config:

<?xml version="1.0"?>
<configuration>

<system.web>
<compilation debug="true"/>
</system.web>
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
<security mode="None"/>
</binding>
</webHttpBinding>
</bindings>
<services>
<service name="ImgService.Service1">
<endpoint
name="REST"
address=""
binding="webHttpBinding"
contract="ImgService.IDataService"
behaviorConfiguration="restfulBehavior"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="restfulBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>

<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

Это то, что выглядит моя конечная точка, как определено в сервисе:

[OperationContract]
[WebInvoke(UriTemplate = "/WarpImage",
ResponseFormat = WebMessageFormat.Json,
Method = "POST",
RequestFormat = WebMessageFormat.Json)]
ServiceResponse<DataContracts.PROCImgObject> WarpImage(DataContracts.PROCImgObject imgObject);

PROCImgObject определяется следующим образом:

[DataContract]
public class PROCImgObject : PROCServiceObject
{
[DataMember]
public System.Drawing.Point leftWaist { get; set; }

[DataMember]
public System.Drawing.Point rightWaist { get; set; }

[DataMember]
public System.Drawing.Point leftNavel { get; set; }

[DataMember]
public System.Drawing.Point rightNavel { get; set; }

[DataMember]
public System.Drawing.Point leftHips { get; set; }

[DataMember]
public System.Drawing.Point rightHips { get; set; }

[DataMember]
public int BodyTypeID { get; set; }

[DataMember]
public double WaistInInches { get; set; }

[DataMember]
public String Base64EncodedImageData { get; set; }

public PROCImgObject()
{
Service1.writeMessage("Create image called");
}
}

Данные растрового изображения кодируются base64 и передаются службе как часть структуры JSON.

Теперь, чтобы протестировать ошибку, я делаю звонок от приложения для Android, которое я разрабатываю, чтобы проверить это. Чтобы проверить, с каким размером не получается изображение, я начал изменять размер изображения в коде.

Ниже приведен фрагмент кода для изменения размера изображения:

        PROCImgObject imgObj = new PROCImgObject();
imgObj.BodyTypeID = 4;
imgObj.WaistInInches = 40;
Bitmap resized = ImageUtil.getResizedBitmap(mCurrentPicture.TheBitmap, 300, 300);
int numberOfBytes = resized.getByteCount();
String base64 = ImageUtil.encodeTobase64(resized);
imgObj.Base64EncodedImageData = base64;

warpService = new ServicePostWarpImage();
warpService.execute(imgObj);
warpService.delegate = SnapImage.this;

Когда я изменяю размер растрового изображения до 255,255... конечная точка запускает и работает нормально.

Когда я изменяю размер растрового изображения до 256,256... конечная точка никогда не запускается и код никогда не срабатывает. Я также не получаю никакого исключения... это сервис, просто отклоняющий вызов из-за размера строки base64Encoded в структуре JSON?

Я действительно благодарен за понимание/толчок в правильном направлении/предложения о том, как лучше настроить конфигурацию и код.

Я несколько новичок в WCF.

Всем спасибо.

спросил(а) 2014-09-14T07:49:00+04:00 6 лет назад
1
Решение
97

Черт возьми... это уже второй раз, когда я ответил на свой вопрос. Я не знаю, что это такое... но я могу исследовать часами, а затем, когда я отправляю вопрос в SO, я понимаю это.

В любом случае... Я был близок.

Это все о maxReceivedMessageSize. То, что меня разозлило, это то, что я возился с этой ВСЕЙ НОЧЕЙ. Grrrr... так или иначе он работает.

Здесь обновленная привязка:

Я изменил это:

<webHttpBinding>
<binding maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:10:00" sendTimeout="00:03:00">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" />
<security mode="None"/>
</binding>
</webHttpBinding>

ЭТО (WTF):

<webHttpBinding>
<binding maxReceivedMessageSize = "1000000">
<security mode="None" />
</binding>
</webHttpBinding>

Не спрашивайте меня, почему это работает. Я просто повернул ручки, пока не удался. (Развести руки)

ответил(а) 2014-09-14T09:18:00+04:00 6 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема