Возврат изображения из службы RESTful WCF - PullRequest
5 голосов
/ 01 декабря 2011

У меня есть это очень простое DTO:

[DataContract]
public class DTO
{
    [DataMember]
    public byte[] Image {get; set; }
}

И это очень простое обслуживание:

[ServiceContract]
public interface IFooService
{
    [WebGet(
        UriTemplate = "", 
        RequestFormat = WebMessageFormat.Json, 
        ResponseFormat = WebMessageFormat.Json)]
    List<DTO> GetDTOs();
}

В моем global.asax у меня есть:

RouteTable.Routes.Add(new ServiceRoute("foo", 
    new WebServiceHostFactory(), typeof(FooService)));

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

Или есть ли лучший способ сделать это?Я попытался изменить byte[] на Stream, но затем, когда я вызываю службу из Firefox, ответ пуст, несмотря на код состояния HTTP 200. Я использую Firebug и Fiddler.

Я недумаю, что это актуально, но поскольку слишком много информации никогда не причинит вреда никому, кто не был роботом, вот web.config:

<?xml version="1.0"?>
<configuration>
    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior>
                    <serviceMetadata httpGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
    </system.serviceModel>
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true">
            <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        </modules>
    </system.webServer>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
</configuration>

В конечном счете, я предполагаю, что вопрос заключается в следующем: как вы возвращаете растровое изображение изWCF RESTful сервис, поэтому JavaScript, запущенный в браузере, может вывести его на экран?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

Хорошо, пока.Теперь, как мне превратить этот массив байтов в изображение?

Поскольку вы пометили свой вопрос javascript, я предполагаю, что это то, что вы используете для использования сервиса, и вы хотите отобразить изображениев браузере.В этом случае вы можете взглянуть на схему URI данных , которая позволит вам показать изображение с учетом байтов, которые вы получаете от сервиса.

Вот пример того, как вы могли быиспользовать такой сервис с помощью jQuery и показать изображение:

$(function () {
    $.getJSON('/foo/', function (dtos) {
        $.each(dtos, function (index, dto) {
            var str = String.fromCharCode.apply(String, dto.Image);
            $('<img/>', {
                alt: '',
                src: 'data:image/png;base64,' + $.base64.encode(str)
            }).appendTo('body');
        });
    });
});

Функция $.base64.encode взята из этого плагина .

0 голосов
/ 08 мая 2012

Проблема с использованием WCF для этого заключается в том, что платформы веб-сервисов (и, в частности, WCF) делают много предположений о результирующем ответе. Когда вы запрашиваете изображение с сервера, тип содержимого ответа HTTP обычно отличается от типа запроса API.

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

ASP .Net Web API загрузка изображений в двоичном виде

Вы были бы намного счастливее, если бы вы просто внедрили собственный обработчик HTTP . API-интерфейсы предназначены для структурированных данных, а изображения не являются структурированными данными - они являются двоичными. У них есть свое место в HTTP, и я думаю, что отделить их от API - хорошая идея.

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