Hi
I am trying to use ASP.NET Web API in SharePoint 2013 farm based solution. I have followed instructions mentioned in the SignalR can be run by means of a simple HttpModule. and also followed instructions in thread from stackoverflow
SharePoint 2013 and ASP.NET WebApi
still it does not work. Can anyone please help me with this?
Following is the code HTTPModule
namespace SPWEBAPISupportModule{
public class SPWebAPIHTTPModule : IHttpModule { public static bool IsAttached = false; private readonly object _lock = new object(); public void Dispose() { //Nothing to clean up. } public void Init(HttpApplication context) { try { //check if the call before attached. if (IsAttached) return; SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory( "SPWEBAPISupportModule.SPWebAPIHTTPModule", TraceSeverity.Medium, EventSeverity.Information), TraceSeverity.Medium, string.Format("SPWebAPIHTTPModule: Attaching Web API and VirtualPathProvider"), null); lock (_lock) { HttpConfiguration config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "SP/api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; config.Services.Replace(typeof(IAssembliesResolver), new SPAssemblyResolver()); //register the custom VirtualPath provider that trims the starting ~ from the requested url. System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SPWebApiVirtualPathProvider()); IsAttached = true; } } catch (Exception ex) { SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory( "SPWEBAPISupportModule.SPWebAPIHTTPModule", TraceSeverity.Medium, EventSeverity.Error), TraceSeverity.Medium, string.Format("SPWebAPIHTTPModule: Exception occurred: " + ex.Message + ex.InnerException + ex.StackTrace), null); } } }
}
SPAssemblyResolver
namespace SPWEBAPISupportModule
{
public class SPAssemblyResolver : IAssembliesResolver
{
public ICollection<Assembly> GetAssemblies()
{
return new List<Assembly> { Assembly.GetExecutingAssembly() };
}
}
}SPWebApiVirtualParthProvider:
namespace SPWEBAPISupportModule
{ public class SPWebApiVirtualPathProvider : VirtualPathProvider { public override string CombineVirtualPaths(string basePath, string relativePath) { return Previous.CombineVirtualPaths(basePath, relativePath); } public override System.Runtime.Remoting.ObjRef CreateObjRef(Type requestedType) { return Previous.CreateObjRef(requestedType); } /// <summary> /// This is the only method where we need to do something. Every request containing signalr and the evil character (~), we remove the evil character. /// </summary> /// <param name="virtualDir"></param> /// <returns></returns> public override bool DirectoryExists(string virtualDir) { SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("SPWEBAPISupportModule.SPWebApiVirtualPathProvider", TraceSeverity.Medium, EventSeverity.Information), TraceSeverity.Medium, string.Format("SPWebApiVirtualPathProvider.DirectoryExists: virtual dir: " + virtualDir), null); //removing the evil character - otherwise the hell freezes and yeah, SharePoint. if (virtualDir != null && virtualDir.Contains("SP/api")) { SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("SPWEBAPISupportModule.SPWebApiVirtualPathProvider", TraceSeverity.Medium, EventSeverity.Information), TraceSeverity.Medium, string.Format("SPWebApiVirtualPathProvider.DirectoryExists: inside if condition"), null); string tmp = virtualDir.TrimStart('~'); return Previous.DirectoryExists(tmp); } try { return Previous.DirectoryExists(virtualDir); } catch (Exception ex) { SPDiagnosticsService.Local.WriteTrace(0, new SPDiagnosticsCategory("SPWEBAPISupportModule.SPWebApiVirtualPathProvider", TraceSeverity.Medium, EventSeverity.Information), TraceSeverity.Medium, string.Format("SPWebApiVirtualPathProvider.DirectoryExists: Exception: " + ex.Message + ex.InnerException + ex.StackTrace), null); return false; } } public override bool FileExists(string virtualPath) { return Previous.FileExists(virtualPath); } public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart) { return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); } public override string GetCacheKey(string virtualPath) { return Previous.GetCacheKey(virtualPath); } public override VirtualDirectory GetDirectory(string virtualDir) { return Previous.GetDirectory(virtualDir); } public override VirtualFile GetFile(string virtualPath) { return Previous.GetFile(virtualPath); } public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies) { return Previous.GetFileHash(virtualPath, virtualPathDependencies); } } }
Controller
ublic class ProductController : ApiController
{
static readonly IProductRepository repository = new ProductRepository();
public IEnumerable<Product> GetAllProducts()
{
return repository.GetAll();
}
public Product GetProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return item;
}
public IEnumerable<Product> GetProductsByCategory(string category)
{
return repository.GetAll().Where(
p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase));
}
public HttpResponseMessage PostProduct(Product item)
{
item = repository.Add(item);
var response = Request.CreateResponse<Product>(HttpStatusCode.Created, item);
string uri = Url.Link("DefaultApi", new { id = item.Id });
response.Headers.Location = new Uri(uri);
return response;
}
public void PutProduct(int id, Product product)
{
product.Id = id;
if (!repository.Update(product))
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
}
public void DeleteProduct(int id)
{
Product item = repository.Get(id);
if (item == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
repository.Remove(id);
}
}Model. IProductRepository
public interface IProductRepository { IEnumerable<Product> GetAll(); Product Get(int id); Product Add(Product item); void Remove(int id); bool Update(Product item); }
Product.cs
namespace SPWEBAPISupportModule.Models
{
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Category { get; set; }
public decimal Price { get; set; }
}
}ProductRepository.cs
namespace SPWEBAPISupportModule.Models
{
public class ProductRepository : IProductRepository
{
private List<Product> products = new List<Product>();
private int _nextId = 1;
public ProductRepository()
{
Add(new Product { Name = "Tomato soup", Category = "Groceries", Price = 1.39M });
Add(new Product { Name = "Yo-yo", Category = "Toys", Price = 3.75M });
Add(new Product { Name = "Hammer", Category = "Hardware", Price = 16.99M });
}
public IEnumerable<Product> GetAll()
{
return products;
}
public Product Get(int id)
{
return products.Find(p => p.Id == id);
}
public Product Add(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
item.Id = _nextId++;
products.Add(item);
return item;
}
public void Remove(int id)
{
products.RemoveAll(p => p.Id == id);
}
public bool Update(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
int index = products.FindIndex(p => p.Id == item.Id);
if (index == -1)
{
return false;
}
products.RemoveAt(index);
products.Add(item);
return true;
}
}
}Regards,
RK
Radhakrishna