PDF с использованием WCF Restful Services - PullRequest
2 голосов
/ 25 июля 2011

Задача: чтобы иметь возможность отобразить PDF, когда пользователь щелкает ссылку (которая является службой WCF {пример: http://localhost:6186/MyReportServices.svc/reports/012}). Служба отправляет и получает отчет с сервера SSRS и возвращает поток. кусок кода, который находится в.

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class AssistReportServices : IAssistReportServices
{
    public Stream GetReport(int value)
    {
      //skipped some lines of code. 
      try
        {
          result = rs.Render(format, devInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
          execInfo = rs.GetExecutionInfo();             
        }
      catch (SoapException err)
        {
            throw;
        }
      MemoryStream ms = new MemoryStream();
      ms.Write(result, 0, result.Length);
      ms.Position = 0;
      //WebOperationContext.Current.OutgoingResponse.ContentType = ConfigurationManager.AppSettings["ResponseType"];
      WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
      return ms; 
    }
 }

Мой контракт на эксплуатацию выглядит так:

[OperationContract(Action = "*")]
[WebInvoke(Method = "POST",
    UriTemplate = "reports/{value}")]
Stream GetReport(int value);

Пока все хорошо. Но вот проблема ... Когда я нажимаю на ссылку выше, я получаю следующую ошибку в диалоговом окне с заголовком Adobe Reader и сообщением:

Файл не начинается с «% PDF -».

Изображение ошибки: http://i.imgur.com/A4J68.png

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 26 июля 2011

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

static void Main(string[] args)
{

    ServiceHost serviceHost = new ServiceHost(typeof(MyReportingServices.MyReportServices), ServiceEndpointUri);
    WebHttpBinding binding = new WebHttpBinding();
    ServiceEndpoint sep = serviceHost.AddServiceEndpoint(typeof(MyReportingServices.IMyReportServices), binding, string.Empty);
    sep.Behaviors.Add(new WebHttpBehavior());
    serviceHost.Open();
    Console.WriteLine("Service is running @ " + ServiceEndpointUri);
    Console.WriteLine();
    Console.WriteLine("Press enter to shutdown service.");
    Console.ReadLine();
    serviceHost.Close();
}

Ошибка:

Операция 'GetReport' в контракте 'IMyReportServices' имеет переменную пути с именем 'value', которая не имеет тип 'string'.Переменные для сегментов пути UriTemplate должны иметь тип 'string'.

Я решил, изменив тип данных для моих параметров операции на String.

Благодаря Mrchief , так как я использовал его ввод, чтобы добавить следующую строку кода, чтобы помочь мне отобразить диалоговое окно Сохранить / Отменить: -

WebOperationContext.Current.OutgoingResponse.ContentType = "application/pdf";
WebOperationContext.Current.OutgoingResponse.Headers.Add("Content-disposition", "inline; filename=apurvReport.pdf"); 
0 голосов
/ 25 июля 2011

Как вы отправляете это в браузер? Похоже, что его отправили с неправильным типом пантомимы. Это должно войти как Response.ContentType = "application/pdf";

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