How to Use Akismet With ASP.NET MVC

In the blog post prior to this one I discussed the pros and cons of Akismet. This article will discuss how to implement Akismet in your ASP.NET MVC app.

Note: I am currently using ASP.NET MVC 3 with Razor views, just in case that makes any difference.

Step 1: Sign up at and get your API key. (Akismet is free for personal use)

Step 2: Download the .Net 2.0 API library. This works with .NET 4 just fine.
Note: There is no binary to download. You will have to download the zipped C# project, open it in visual studio, and build the project to create Joel.Net.Akismet.dll.

Step 3: Add a reference to the Joel.Net.Akismet.dll library in your MVC project.

Step 4: Create a new ActionFilterAttribute:

public class AkismetCheckAttribute : ActionFilterAttribute
    public AkismetCheckAttribute(
        string authorField,
        string emailField,
        string websiteField,
        string commentField)
        this.AuthorField = authorField;
        this.EmailField = emailField;
        this.WebsiteField = websiteField;
        this.CommentField = commentField;

    public string AuthorField { get; set; }
    public string EmailField { get; set; }
    public string WebsiteField { get; set; }
    public string CommentField { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
        //Create a new instance of the Akismet API and verify your key is valid.
        Akismet api = new Akismet("-= API KEY HERE =-", "", filterContext.HttpContext.Request.UserAgent);
        if (!api.VerifyKey()) throw new Exception("Akismet API key invalid.");

        //Now create an instance of AkismetComment, populating it with values
        //from the POSTed form collection.
        AkismetComment akismetComment = new AkismetComment
            Blog = "",
            UserIp = filterContext.HttpContext.Request.UserHostAddress,
            UserAgent = filterContext.HttpContext.Request.UserAgent,
            CommentContent = filterContext.HttpContext.Request[this.CommentField],
            CommentType = "comment",
            CommentAuthor = filterContext.HttpContext.Request[this.AuthorField],
            CommentAuthorEmail = filterContext.HttpContext.Request[this.EmailField],
            CommentAuthorUrl = filterContext.HttpContext.Request[this.WebsiteField]

        //Check if Akismet thinks this comment is spam. Returns TRUE if spam.
        if (api.CommentCheck(akismetComment))
            //Comment is spam, add error to model state.
            filterContext.Controller.ViewData.ModelState.AddModelError("spam", "Comment identified as spam.");

tep 5: Apply it to the appropriate action method. AddComment in my case:

[AkismetCheck("Author", "Email", "Website", "Body")] //Our custom action filter.
public ActionResult AddComment(PostComment newComment)
    if (ModelState.IsValid)
        //Do stuff.

Step 6: Done.

It's that simple!