Проблема с отправкой изображения в сервисе отдыха wcf

Я пишу сервис WCF Rest. Его можно будет использовать для получения и сохранения изображения. Снимаю и отправляю картинку клиентом windows phone 7. Я могу отправить изображение, которое разбирается в потоке (на стороне сервиса), но изображение не будет сохранено из-за "плохого параметра".

Используйте код, чтобы сделать снимок:

private void TakePictureAction()
    {
        //Show the camera
        _camera.Show();
        //Append when camera task finished.
        _camera.Completed += delegate(object sender, PhotoResult e)
                                {
                                    _photoImage = new BitmapImage();
                                    _photoImage.SetSource(e.ChosenPhoto);
                                };
    }

Код, используемый для отправки картинки (с остальными резкими):

var client = new RestClient("http://127.0.0.1:81/Service.svc");
var request = new RestRequest("/uploadImage", Method.POST);
request.AddBody(_photoImage);
try
{
    client.ExecuteAsync(request, response =>
                                 {
                                    //Do stuff
                                 });
}
catch (Exception ex)
{
    MessageBox.Show("error");
}

И код на стороне сервера:

public void UploadImage(Stream fileStream)
{
    if (fileStream != null)
    {
        string filePath = @"c:\";
        using (FileStream fileToUpload = new FileStream(filePath + "ok.bmp", FileMode.Create))
        {
            byte[] byteArray = new byte[10000];
            int bytesRead = 0;
            do
            {
                bytesRead = fileStream.Read(byteArray, 0, byteArray.Length);
                if (bytesRead > 0)
                {
                    fileToUpload.Write(byteArray, 0, bytesRead);
                }
            } while (bytesRead > 0);
            using (MemoryStream ms = new MemoryStream(byteArray))
            {
                Bitmap img = (Bitmap)Image.FromStream(ms);
                img.Save(@"c:\img.bmp");
            }
        }
    }
}

Мой метод обслуживания

 [OperationContract]
        [WebInvoke(UriTemplate = "/uploadImage", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
        void UploadImage(Stream img);

Где я не прав?


person David    schedule 27.04.2012    source источник
comment
может быть, вам нужно добавить еще один символ `\` в часть img.save, а также в путь к файлу?   -  person Ivan Crojach Karačić    schedule 27.04.2012
comment
спасибо, это было частью проблемы. Но при попытке открыть изображение возникает ошибка. Как будто изображение было не в хорошем формате.   -  person David    schedule 27.04.2012


Ответы (3)


Мой метод обслуживания определяется следующим образом:

[WebInvoke]
string PostImage(Stream stream);

Реализация метода обслуживания, как показано ниже:

public string PostImage(Stream stream)
        {
            var ms = new MemoryStream();
            stream.CopyTo(ms);
            var streamBytes = ms.ToArray();            
            FileStream f = new FileStream("C:\\temp\\sample.jpg", FileMode.OpenOrCreate);
            f.Write(streamBytes, 0, streamBytes.Length);
            f.Close();
            ms.Close();
            stream.Close();
            return "Recieved the image on server";
        }

Теперь из своего клиента я загружаю картинку, как показано:

Image image = Image.FromFile("C:\\Sample.png"); // NOTE : Replace your photo location from the camera here
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
byte[] imageArray = ms.ToArray();
ms.Close();

var client = new RestClient();            
client.BaseUrl = "http://localhost/Service/Service1.svc";
var request = new RestRequest(method) { DateFormat = DataFormat.Xml.ToString(), Resource = "/PostImage" };
request.AddFile("stream", image, "Array.png");
var response = client.Execute(request);
string responseString;
if (response.StatusCode == HttpStatusCode.OK)
{
     responseString = HttpUtility.HtmlDecode(response.Content);
}
person Rajesh    schedule 27.04.2012
comment
Спасибо, но я не могу связаться со своим сервисом, если изменю request.AddBody на request.AddFile. - person David; 27.04.2012
comment
В этом случае вы можете изменить request.AddBody на request.AddParameter (stream, _photoImage, ParameterType.RequestBody); и посмотрите, работает ли это. ПРИМЕЧАНИЕ. Предполагается, что _photoImage имеет тип byte [] - person Rajesh; 27.04.2012
comment
Я могу связаться со службой поддержки, но изображение (sample.jpg) не может быть открыто. - person David; 27.04.2012

Windows Phone сохраняет изображения в формате Jpeg, поэтому проблема здесь, скорее всего, связана с тем, что вы сохраняете файл с расширением «.bmp» (растровое изображение) на сервере, поэтому вы получаете ошибку «плохой формат»!

person Pedro Lamas    schedule 27.04.2012
comment
Я попытался поменять формат на bmp, jpg, png .. и ничего не вышло. - person David; 27.04.2012
comment
Для чего нужна эта часть на стороне сервера с MemoryStream? - person Pedro Lamas; 27.04.2012
comment
то же самое, что мне предложил Раджеш - person David; 27.04.2012

Проблема исходит из моего веб-сервиса. Мне пришлось увеличить размер сообщения (чтобы можно было отправить полное изображение). Я сделал это с помощью этого сообщения о переполнении стека

person David    schedule 09.07.2012