1 messaggio dal 18 luglio 2011
Buongiorno a tutti,
scusatemi se il titolo non è preciso ma, ahimé, non riesco a capire bene la motivazione di tale errore.

Spiego in breve la panoramica del problema.

Ambiente: MVC 5;
DataBase: EF, Sql, ODBC;
Linguaggi usati: c#, javascripts, jquery;

Sto cercando di sviluppare un gestionale documentale con una serie di azioni gestite in maniera automatica prendendo i vari dati dai server.
In questa fase, l'utente, che è un rappresentante a caccia di clienti, immette i dati dell'eventuale cliente per stipulare un PRE-Contratto.

Dopo aver inserito questi dati l'utente clicca sul tasto AVVIA PRECONTRATTO e il programma dovrà:
- scaricare il .PDF appena prodotto
- inviare una mail (presa dalla registrazione AspNetUser) con in allegato copia di tale documento.

Con il seguente codice, dal controller "PreventivoContrattoController", cambio lo stato del contratto e salvo la modifica sul DB.

PreventivoContrattoController : Controller{
public ActionResult EmessaOfferta(int id)
{
if (id.ToString() == null)
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

PrevContr preventivoEmesso = db.PrevContr.Find(id);

if (ModelState.IsValid)
{
preventivoEmesso.Stato_contatto = "Emessa offerta";
db.SaveChanges();
var generaPdf = new PdfsController().GeneratorPdf(id); <-- Metodo di un altro Controller
}
return RedirectToAction("Index");
}
}

Dopo di ciò chiamo il metodo GeneratorPdf(), del controller PdfsController, per generare il file PDF e qua il problema.
Dopo aver istanziato gli oggetti iText, MemoryStream, etc etc, appena legge il seguente metodo:

public class PdfsController : Controller{
private void DownloadPdf(MemoryStream ms)
{
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment;filename=" + FILEPDFNAME + ".pdf");
Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
Response.OutputStream.Flush();
Response.OutputStream.Close();
Response.End();
ms.Close();
}
}

alla prima riga "Response.Clear();", torna l'errore "Response NULL".

Lo stesso errore NON viene generato se richiamo il metodo "DownloadPdf" rimanendo nello stesso controller (PdfsController).

Non capisco proprio dov'è l'errore.
Sembra, da quel poco che ne capisco, che non trova il file memorizzato su Memory Stream.
Scusatemi se il problema è stupido o altro ma sono all'inizio del mio percorso come sviluppatore.

Riporto di seguito il metodo completo "GeneratorPdf()" così da non tralasciare niente:

public ActionResult GeneratorPdf(int idCliente){
Document doc = new Document(PageSize.A4, 10f, 10f, 10f, 0f);
doc.SetMargins(0, 0, 142, 0);

MemoryStream ms = new MemoryStream();
PdfWriter writer = PdfWriter.GetInstance(doc, ms);

PdfPTable table = new PdfPTable(3);
table.TotalWidth = 520f;
table.LockedWidth = true;
float[] widths = new float[] { 110, 220, 220 };
table.SetTotalWidth(widths);
table.SetWidthPercentage(widths, doc.PageSize);

PrevContr prevContr = db.PrevContr.Find(idCliente);
string utenteCorrente = prevContr.UserName;
string mailCorrente = db.AspNetUsers.Where(a => a.UserName == prevContr.UserName).Select(m => m.Email).ToString();

doc.Open();

var i = 0;
foreach (var item in IMAGE)
{
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(item);
img.Alignment = iTextSharp.text.Image.UNDERLYING;
img.ScaleToFit(1700, 850);
img.SetAbsolutePosition(0, 0);
doc.NewPage();

if (i == 0)
doc.Add(BuildFirstTable(table, prevContr, utenteCorrente));

if (i == 1)
doc.Add(BuildSecPg());

if (i == 2)
doc.Add(BuildThreePg());

i++;
doc.Add(img);
}

writer.CloseStream = false;
doc.Close();
ms.Position = 0;
DownloadPdf(ms);

return View("Index");
}

Grazie a tutti anticipatamente e scusatemi se sono poco esaustivo nella spiegazione

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.