如何在无HttpContext的DLL项目中使用System.Web.Helpers.Chart?
Absolutely you can use System.Web.Helpers.Chart in a non-web DLL project, but you'll need to work around its dependency on HttpContext since that's not available by default in non-web contexts. Let's break down why you're seeing the error and how to fix it:
Why the ArgumentNullException happens
The default constructor of System.Web.Helpers.Chart relies on HttpContext to handle things like temporary image storage, rendering context, and server path resolution. Since your DLL project doesn't have an active web request context, HttpContext.Current is null, triggering the error.
Fix 1: Mock a minimal HttpContextBase
You can manually provide a mock HttpContextBase instance to the Chart's overloaded constructor. This works well if you need to use the full feature set of the Chart library (like saving to server paths). Here's an example using the Moq library:
First, install Moq via NuGet:
Install-Package Moq
Then use it to create a mock context:
using Moq; using System.Web; using System.Web.Helpers; var mockHttpContext = new Mock<HttpContextBase>(); // Mock Server.MapPath to point to a writable directory on your machine mockHttpContext.Setup(c => c.Server.MapPath(It.IsAny<string>())) .Returns(@"C:\Your\Writable\Temp\Directory"); // Initialize Chart with the mock context var myChart = new Chart(mockHttpContext.Object, width: 600, height: 400) .AddTitle("Chart Title") .AddSeries( name: "Employee", xValue: new[] { "Peter", "Andrew", "Julie", "Mary", "Dave" }, yValues: new[] { "2", "6", "4", "5", "3" }); // Save the chart to a file myChart.Save(@"C:\Your\Writable\Temp\Directory\EmployeeChart.png");
Make sure the directory you specify exists and your application has write permissions to it.
Fix 2: Bypass HttpContext by rendering directly to an Image
Some versions of System.Web.Helpers.Chart let you render the chart directly to an Image object without relying on HttpContext. Try using the GetImage() method:
using System.Drawing; using System.Web.Helpers; var myChart = new Chart(width: 600, height: 400) .AddTitle("Chart Title") .AddSeries( name: "Employee", xValue: new[] { "Peter", "Andrew", "Julie", "Mary", "Dave" }, yValues: new[] { "2", "6", "4", "5", "3" }); // Get the chart as an Image object using (var chartImage = myChart.GetImage()) { // Save to a file or stream chartImage.Save(@"C:\Your\Writable\Temp\Directory\EmployeeChart.png", ImageFormat.Png); }
Note: You may need to add a reference to System.Drawing in your DLL project for this to work.
Alternative: Use a non-web-focused chart library
If you run into persistent issues with System.Web.Helpers.Chart in a non-web project, consider switching to a library designed for non-web scenarios:
- OxyPlot: Open-source, cross-platform, and works with both web and non-web apps.
- ScottPlot: Lightweight, easy to use, and supports console/desktop apps.
- System.Windows.Forms.DataVisualization.Charting: Built into .NET, ideal for Windows desktop/console projects.
内容的提问来源于stack exchange,提问作者Vivendi

