2012-06-05 19 views
8

मेरे पास एक रिपोर्टिंग सेवा सर्वर है जो पहले से ही कुछ चल रही रिपोर्ट है, और अब मुझे एक कस्टम वेबसाइट (एएसपीएनटी एमवीसी 3 चलाने) के माध्यम से उत्पन्न करने की आवश्यकता है।रिपोर्टिंग सेवाएं: जेनरेट की गई रिपोर्ट का पीडीएफ प्राप्त करें

मुझे इस रिपोर्ट को उपयोगकर्ता को भेजने के लिए स्ट्रीम/बाइट के रूप में पुनर्प्राप्त करने की आवश्यकता है। नहीं "रिपोर्ट दर्शक" या तो।

पिछली बार जब मैंने रिपोर्टिंग सेवाओं का उपयोग किया था तो 2005 के साथ था, और हमें एक अस्पष्ट एएसएमएक्स फ़ाइल के संदर्भ में विज्ञापन देना चाहिए।

एसक्यूएल सर्वर रिपोर्टिंग 2008 आर 2, नेट 4 और विजुअल स्टूडियो 2010 के साथ अब क्या है? मुझे पूरी बात समझाते हुए एक ट्यूटोरियल नहीं मिल रहा है।

+1

ई वेब सेवा एपीआई। उस वेब सेवा के बारे में * अस्पष्ट * क्या है? – Yuck

उत्तर

15

कई तरीकों MSDN पर प्रदान की जाती हैं (वास्तव में मैं एक ट्यूटोरियल जहां एसक्यूएल 2008 R2 के लिए कोई रिपोर्ट दर्शक है नहीं मिल सकता है)। मैंने एएसपी .NET ऐप में त्वरित सरल पीडीएफ बटन के लिए अक्सर URL access का उपयोग किया है।

यह कोड करने का एक त्वरित हैक बिट यहां है। इसे एकीकृत प्रमाणीकरण का उपयोग करने के लिए साफ़ किया जा सकता है, और रिपोर्ट नाम को स्टोर करने के कई तरीके हैं। (मैं कट और कुछ पुराने कोड रहा था कि बाद में एक डेटाबेस के लिए एक रिपोर्ट की दुकान और फिर वापस आ सकता है कि डाटाबेस से से चिपकाया।

// First read in the report into memory. 

string strReportUser = "RSUserName"; 
string strReportUserPW = "MySecretPassword"; 
string strReportUserDomain = "DomainName"; 

string sTargetURL = "http://SqlServer/ReportServer?" + 
    "/MyReportFolder/Report1&rs:Command=Render&rs:format=PDF&ReportParam=" + 
    ParamValue; 

HttpWebRequest req = 
     (HttpWebRequest)WebRequest.Create(sTargetURL); 
req.PreAuthenticate = true; 
req.Credentials = new System.Net.NetworkCredential(
    strReportUser, 
    strReportUserPW, 
    strReportUserDomain); 

HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); 

Stream fStream = HttpWResp.GetResponseStream(); 




//Now turn around and send this as the response.. 
byte[] fileBytes = ReadFully(fStream); 
// Could save to a database or file here as well. 

Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader(
    "content-disposition", 
    "attachment; filename=\"Report For " + 
     ParamValue + ".pdf\""); 
Response.BinaryWrite(fileBytes); 
Response.Flush(); 
HttpWResp.Close(); 
Response.End(); 

ReadFully

public static byte[] ReadFully(Stream input) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
} 
+0

लेकिन, पहचान का प्रबंधन कैसे करें? चूंकि सभी उपयोगकर्ताओं को रिपोर्टिंग सेवाओं तक पहुंच नहीं होनी चाहिए, नहीं? – J4N

+0

क्या आप मुझे यूआरएल से एसएसआरएस से रिपोर्ट प्राप्त करने के लिए सही कक्षा/उदाहरण के लिए इंगित कर सकते हैं? मुझे यह स्वीकार करना होगा कि मुझे नहीं पता कि यूआरएल तक कैसे पहुंचना है, प्रमाण पत्र निर्दिष्ट करना और रिपोर्ट डाउनलोड करना। बहुत बहुत धन्यवाद! – J4N

+0

यह सुनिश्चित नहीं है कि आप क्या देख रहे हैं। ऊपर पोस्ट किए गए यूआरएल एक्सेस लिंक में विभिन्न यूआरएल के तीन उदाहरण हैं जिनका उपयोग रिपोर्ट तक पहुंचने के लिए किया जा सकता है। यह कैसे करें यह विवरण आपकी रिपोर्ट पर निर्भर करता है: आप किस पैरामीटर का उपयोग करते हैं, आप अपने प्रमाण-पत्र कैसे प्राप्त करेंगे। मैंने अपने जवाब में कुछ नमूना सी # कोड जोड़ा है। लेकिन अगर आप बेहतर उदाहरण चाहते हैं, तो कृपया हमें बताएं कि आपको किस हिस्से में कठिनाई हो रही है। –

0

है क्योंकि आप नेस्ट है नदियों, आप प्रतिलिपि के बाद पहली धारा बंद करने के लिए एक बंद धारा त्रुटि से बचने के, यदि आप एक 401 अनधिकृत मिल मुझे लगता है कि आप वें के माध्यम से SSRS पहुँचने के बारे में बात कर रहे हैं कर सकते हैं। इसके अलावा, डिफ़ॉल्ट क्रेडेंशियल्स का प्रयास करें।

  req.UseDefaultCredentials = true; 
      req.PreAuthenticate = true; 
      req.Credentials = CredentialCache.DefaultCredentials; 

      HttpWebResponse HttpWResp = (HttpWebResponse)req.GetResponse(); 

      Stream fStream = HttpWResp.GetResponseStream();     

      //Now turn around and send this as the response.. 
      byte[] fileBytes = ReadFully(fStream); 
      // Could save to a database or file here as well. 
      HttpWResp.Close();