2012-12-14 37 views

cevap

17

sorun Delphi DİNLENME sunucu her zaman/html metne içerik türünü belirler şudur: Burada, bir resim döndüren bir örnek yöntemidir. Bu, diğer içerik türlerini gönderdiğinizde tarayıcıyı karıştırır. Bu bir hatadır, çünkü çoğu yanıt json'dur, yani en mantıklı varsayılan içerik türü uygulama/json olmalıdır.

Neyse ki, sunucu türünden içerik türünü geçersiz kılmanın bir yolu var.

Uygulamanızın kullanım listesine DataDBXPlatform eklemeniz gerekir.

Bu birim, oluşturulmakta olan yanıtlara erişim sağlayan GetInvocationMetadata işlevini içerir. Diğer yararlı özellikler arasında ResponseContentType özelliğine sahip bir TDSInvocationMetadata nesnesi döndürür.

Bu özelliğin ayarlanması, yöntemin http yanıtında döndürdüğü Content-Type üstbilgisini geçersiz kılar.

verilen örnek olur:

function TServerClass.Image: TFileStream; 
begin 
    Result := TFileStream.Create('pathtofile\image.png', fmOpenRead or fmShareDenyNone); 
    GetInvocationMetadata.ResponseContentType := 'image/png'; 
end; 

Şimdi sonuç görüntü tarayıcıda düzgün görüntülenir.

1

Bu problemi, farklı bir dosya türünü (png, pdf, xlsx, docx, etc ...) DataSnap REST sunucusundan (Delphi XE3) bir JavaScript web istemcisine indirmeye çalışıyorum. Bazı tarayıcılar (es .: FireFox) yine de doğru eylemde bulunacaklar, ancak hepsi değil. Internet Explorer, indirilen dosya için doğru içerik türü olmadan uygun eylemi tanımıyor. @Anders çözümü başlangıçta benim için çalışacak gibi görünüyor çünkü PDF ve Firefox ile çalışıyordum. Ama IE (ve diğerleri) üzerinde ve farklı uzantıları ile test ettiğimde, tanınamayan dosyalar. O Content-Type benim için çalışmayı bulundu

GetInvocationMetadata.ResponseContentType := '...my assigned content type ...'; 

geçici çözüm kullanılarak atanmış bir "text/html" her zaman ve değil gördüğüm FireBug kullanarak geçerli: ServerMethodsUnit olarak

var 
    ContentTypeHeaderToUse: string; // Global variable 

TServerMethods1.GetFile(params: JSON):TStream; 
begin 
    .... processing .... 
    ContentTypeHeaderToUse := '...' (assign correct content type). 
end; 
WebModuleUnit olarak

procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    if ContentTypeHeaderToUse<>'' then begin 
    Response.ContentType := ContentTypeHeaderToUse; 
    ContentTypeHeaderToUse := ''; // Reset global variable 
    end; 
end; 

I içerikli-Disposition atamak için benzer bir çözümü kullanılan çok. Bu, dosya adını indirme ve ek/satır içi moduna ayarlamak için kullanışlı bir başlık anahtarıdır.

procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject; 
    Request: TWebRequest; Response: TWebResponse; var Handled: Boolean); 
begin 
    if ContentDispositionHeaderToUse<>'' then begin 
    Response.SetCustomHeader('content-disposition',ContentDispositionHeaderToUse); 
    ContentDispositionHeaderToUse := ''; 
    end; 
    if ContentTypeHeaderToUse<>'' then begin 
    Response.ContentType := ContentTypeHeaderToUse; 
    ContentTypeHeaderToUse := ''; 
    end; 
end; 

Ata ContentDispositionHeaderToUse sunucu yöntemleri uygulamaya: kodudur bu biriyle .

DÜZENLEME

Bu geçici çözüm veri sıkıştırma özellikli ile IIS üzerinde ISAPI DLL çalışmaz!hiçbir veri compressione (yerel debuggin IIS) yanıt başlığı olduğu ile : DataSnap kodunda atanan

Content-Encoding gzip 
Content-Length 11663 
Content-Type text/html 
Date Thu, 11 Sep 2014 21:56:43 GMT 
Pragma dssession=682384.52215.879906,dssessionexpires=1200000 
Server Microsoft-IIS/7.5 
Vary Accept-Encoding 
X-Powered-By ASP.NET 

Content-disposition ve içerik türüyle:

Connection close 
Content-Disposition inline; filename="Privacy-0.rtf.pdf" 
Content-Length 150205 
Content-Type application/pdf; charset=ISO-8859-1 
Pragma dssession=28177.371935.39223,dssessionexpires=1200000 

ancak etkin üretimle

yanıtı IIS ile geliyor yüzeysel değildir.