Сохранение изображения в базу данных как varbinary (часть 3) - PullRequest
1 голос
/ 26 ноября 2011

Это снова проблема с сохранением изображений в silverlight в моей базе данных, я думал, что у меня все это работает, пока я не попробовал это с другим изображением ...

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

 private void btnUpload_Click(object sender, RoutedEventArgs e)
        {
            //nieuwe instantie van de klasse "Afbeelding", om later door te sturen naar service
            Afbeelding a = new Afbeelding();

            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "JPEG files|*.jpg";

            if (openFileDialog.ShowDialog() == true)
            {
                //Afbeelding ophalen via open dialoog
                Stream stream = (Stream)openFileDialog.File.OpenRead();
                string fileName = openFileDialog.File.Name;

                //Converteren naar bytes
                //byte[] bytes = BinaryConverter.convertToByte(stream);
                byte[] bytes = new byte[stream.Length];
                stream.Read(bytes, 0, (int)stream.Length);

                //aan de instantie de Binary waarde van de afbeelding meegeven om naar de database te sturen
                a.id = 1;
                a.source = new Binary { Bytes = bytes };
            }

            EditAfbeeldingServiceClient client = new EditAfbeeldingServiceClient();

            client.UpdateAfbeeldingCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(client_UpdateAfbeeldingCompleted);
            client.UpdateAfbeeldingAsync(a);
        }

И на своем служении я делаю это:

    [OperationContract]
    public void UpdateAfbeelding(Afbeelding a)
    {
        var query = (from p in dc.Afbeeldings 
                     where p.id == a.id
                     select p).SingleOrDefault();

        query.source = a.source;
        dc.SubmitChanges();

    }

Теперь во время моего тестирования все это работало, но я использовал только одно изображение для тестирования ... Поэтому, когда я только что попробовал с другим изображением, я получаю следующую ошибку:

System.ServiceModel.ProtocolException: The remote server returned an unexpected response: (400) Bad Request. In Silverlight, a 404 response code may be reported even when the service sends a different error code. ---> System.Net.WebException: The remote server returned an error: NotFound. ---> System.Net.WebException: The remote server returned an error: NotFound.
   at System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
   at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState)
   at System.Net.Browser.AsyncHelper.<>c__DisplayClass4.<BeginOnUI>b__0(Object sendState)
   --- End of inner exception stack trace ---
   at System.Net.Browser.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state)
   at System.Net.Browser.ClientHttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteGetResponse(IAsyncResult result)
   --- End of inner exception stack trace ---
   at System.ServiceModel.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Channels.ServiceChannel.EndCall(String action, Object[] outs, IAsyncResult result)
   at System.ServiceModel.ClientBase`1.ChannelBase`1.EndInvoke(String methodName, Object[] args, IAsyncResult result)
   at OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingServiceClient.EditAfbeeldingServiceClientChannel.EndUpdateAfbeelding(IAsyncResult result)
   at OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingServiceClient.OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingService.EndUpdateAfbeelding(IAsyncResult result)
   at OndernemersAward.EditAfbeeldingServiceReference.EditAfbeeldingServiceClient.OnEndUpdateAfbeelding(IAsyncResult result)
   at System.ServiceModel.ClientBase`1.OnAsyncCallCompleted(IAsyncResult result)

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

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

<readerQuotas maxDepth="32"
maxStringContentLength="2147483647"
maxArrayLength="2147483647"
maxBytesPerRead="2147483647"
maxNameTableCharCount="2147483647" />

Вы можете найти мой web.config здесь: http://pastebin.com/whMs5h1w

Спасибо за вашу помощь, я действительно ценю это. Томас

Редактировать: мне удалось получить более читаемую ошибку с включенной трассировкой, надеюсь, это кому-нибудь поможет:)

1 Ответ

1 голос
/ 26 ноября 2011

WCF имеет различные встроенные ограничения. Один из них - maxReceivedMessageSize, который по умолчанию равен 65536 байтам, а другой - maxArrayLength (не уверен, что является значением по умолчанию).Существует высокая вероятность того, что вы превысили один из двух (или оба).Вы можете изменить их в своей конфигурации сервиса. Эта статья о MSDN содержит несколько примеров конфигураций.

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

Кстати: существует метод File.ReadAllBytes.

Редактировать : Очевидно, существует инструмент под названием Fiddler , который может помочь отследить этипроблемы вниз.

...