|
SL4, RIA - как показать пользователю PDF из БД?
|
|||
---|---|---|---|
#18+
Здравствуйте. Задача - 1) загрузить на сервер произвольный документ (pdf, jpg, docx... - что угодно) и положить в БД. С этим более-менее ясно. 2) при надобности - показать его пользователю. Не "выгрузить с сервера на диск и пусть открывает сам нужной программой", а сразу открыть в окне, пусть с ходу смотрит. При использовании традиционного web-сервиса я заставлял один из методов сервиса полностью сформировать web-страницу, на клиенте склеивал URL на нужный метод сервиса с нужнм параметром, открывал новое окно браузера с этим url'ом, и браузер дальше разбирался с pdf-ками (jpeg-ами etc) сам. Но вот как сделать то же самое в RIA с DomainService'ом на базе EDM - не соображу. WSDL тщательно упрятан, где что искать?... Как водится, все это нужно было позавчера, и если кто бросит прямо работающие кусочки C# кода для сервера и клиента - будет замечательно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 13:20 |
|
SL4, RIA - как показать пользователю PDF из БД?
|
|||
---|---|---|---|
#18+
А какое отношение RIA, да еще с DomainService, имеют к показу PDF документов? Никакого, он для этого не предназначен ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 13:34 |
|
SL4, RIA - как показать пользователю PDF из БД?
|
|||
---|---|---|---|
#18+
Интернет говорит, что RIA есть тот же WCF сервис, т.е. умеет отдавать информацию не только SL-клиентам, но вообще кому угодно, только обратись к домен-сервису по правильному урлу, и получишь в ответ, скажем, кусок XMLя. (Microsoft'овцы что-то бодро вещали про OData, и что-то там еще) Соответственно, я бы хотел понять, как мне оформить HTTP-урл к какому-нибудь методу доменсервиса, который можно было бы научить при обращении к нему - выливать в HTTP-ответ бинарный поток. Напрямую через HTTP, в обход SL-клиентов. А типовой браузер, увидев перед потоком тег content-type (мой метод конечно его впишет), сам решит и сам покажет. На эти мысли меня навели статьи http://www.silverlightshow.net/items/WCF-RIA-Services-Part-10-Exposing-Domain-Services-To-Other-Clients.aspx http://blogs.msdn.com/b/brada/archive/2009/11/22/ria-services-a-domainservice-is-a-wcf-service-add-service-reference.aspx но с тех времен wsdl видимо как следует укрыли, или тямы нехватает, и повторить фокус у меня не вышло. А надо. Поможите люди добрые кто чем. Скажите как должен выглядеть урл метода (ну хоть типового query с entity'ями), чтобы можно было прочитать ответ не через SL-клиента, и какими атрибутами его декорировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 15:46 |
|
SL4, RIA - как показать пользователю PDF из БД?
|
|||
---|---|---|---|
#18+
wcf.codeplex.com ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2011, 18:05 |
|
SL4, RIA - как показать пользователю PDF из БД?
|
|||
---|---|---|---|
#18+
Ну что ж, через полгода отвечу себе сам. Вдруг кому надо. Реализация корявоватая, кому надо - пусть допиливает сам. Напомню, что - предполагалось показать документ в окне браузера путем записи в Response бинарного потока из БД, и сообщения браузеру mime-типа содержимого (application/pdf, image/png...), а дальше браузер обычно успешно справляется, так или иначе - главным было желание сосредоточить обращение к конкретной БД в одном модуле (именно - в EDM) для простоты переноса приложения, и в одном проекте - для простоты разработки/сопровождения. а) в БД есть процедура, достающая скан, со служебными полями типа заранее сформированного mime-тега, имени файла и т.п. CREATE PROCEDURE [dbo].[Doc_ScanGetById] @ScanId int AS select Id, TypeTag , [FileName] , FileExtention, FileSize , DateDoc , Descr ,ScanBlob AS [Binary] from [dbo].[DOC_SCAN] where ID=@ScanId б) на серверной стороне приложения в стандартной EDM эта процедура подцеплена, импортирована в функцию, функция отдает набор записей комплексного типа STUB_Scan в DomainService это описано как public IQueryable<STUB_Scan> Get_DocScanById(int Id) { return this.ObjectContext.SP_Doc_ScanGetById(Id).AsQueryable(); } в) в MyApp.Web добавлен обычный webservice MyWebService.asmx using MyApp.Web.Models; using MyApp.Web.Domains; using System.ServiceModel.DomainServices.EntityFramework; [WebMethod] public void GetScanAsFile(string ScanId) { MyDomainService domain = new MyDomainService(); string typetag = "text/plain"; int size; IQueryable<STUB_Scan> ResultSet; STUB_Scan Res = null; this.Context.Response.ContentType = typetag; try { ResultSet = domain.Get_DocScanById(Convert.ToInt32(ScanId)); Res = ResultSet.First(); } catch { this.Context.Response.Write(" HET DOKYMEHTA "); this.Context.Response.End(); return; }; try { typetag = Res.TypeTag; size = Res.Binary.Length; this.Context.Response.ContentType = typetag; this.Context.Response.OutputStream.Write(Res.Binary, 0, size); } catch (Exception E) { this.Context.Response.Write(E.Message); } this.Context.Response.End(); } г) на клиентской стороне создаю функцию показа документа на новой закладке (странице?) браузера. public static void ShowDocScan(int ImageId) { // http://localhost:60121/MyWebService.asmx/GetScanAsFile?ScanId=10 string AbsUri = App.Current.Host.Source.AbsoluteUri; string AbsPath = App.Current.Host.Source.AbsolutePath; string AppHostUri = AbsUri.Substring(0,AbsUri.IndexOf(AbsPath)); string scanurl = Publics.AppHostUri + "/MyWebService.asmx/GetScanAsFile?ScanId=" + Convert.ToString(ImageId); Uri scanaddr = new Uri(scanurl, UriKind.Absolute); System.Windows.Browser.HtmlPage.Window.Navigate(scanaddr, "_blank"); } PS. а codeplex там что-то сильно хитрое замутил, я тогда столько букв просто не осилил... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2012, 08:51 |
|
SL4, RIA - как показать пользователю PDF из БД?
|
|||
---|---|---|---|
#18+
реализация передачи файлов (любых) с помощью WCF по http - http://www.gotdotnet.ru/blogs/sergun/6702/ ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2012, 12:45 |
|
|
start [/forum/topic.php?fid=21&gotonew=1&tid=1441817]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get first new msg: |
7ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 312ms |
total: | 465ms |
0 / 0 |