Skip to content

Commit 6ade06a

Browse files
committed
NuGet.Server IIS application converted to use Web Api controller from NuGet.Server.V2 instead of its own WCF dataservice.
1 parent 84f26ba commit 6ade06a

18 files changed

Lines changed: 245 additions & 631 deletions

NuGet.Server.sln

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NuGet.Server.V2.Samples.Owi
3030
EndProject
3131
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NuGet.Server.V2.Tests", "test\NuGet.Server.V2.Tests\NuGet.Server.V2.Tests.csproj", "{BE64E341-7D99-43D9-A0D2-A38E977B7D97}"
3232
EndProject
33+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SampleIISHost", "SampleIISHost\SampleIISHost.csproj", "{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}"
34+
EndProject
3335
Global
3436
GlobalSection(SolutionConfigurationPlatforms) = preSolution
3537
Coverage|Any CPU = Coverage|Any CPU
@@ -184,6 +186,26 @@ Global
184186
{BE64E341-7D99-43D9-A0D2-A38E977B7D97}.Release|Any CPU.Build.0 = Release|Any CPU
185187
{BE64E341-7D99-43D9-A0D2-A38E977B7D97}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
186188
{BE64E341-7D99-43D9-A0D2-A38E977B7D97}.Release|Mixed Platforms.Build.0 = Release|Any CPU
189+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Coverage|Any CPU.ActiveCfg = Release|Any CPU
190+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Coverage|Any CPU.Build.0 = Release|Any CPU
191+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Coverage|Mixed Platforms.ActiveCfg = Release|Any CPU
192+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Coverage|Mixed Platforms.Build.0 = Release|Any CPU
193+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
194+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Debug|Any CPU.Build.0 = Debug|Any CPU
195+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
196+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
197+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Debug|Any CPU.ActiveCfg = Debug|Any CPU
198+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Debug|Any CPU.Build.0 = Debug|Any CPU
199+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
200+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Debug|Mixed Platforms.Build.0 = Debug|Any CPU
201+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Release|Any CPU.ActiveCfg = Release|Any CPU
202+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Release|Any CPU.Build.0 = Release|Any CPU
203+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Release|Mixed Platforms.ActiveCfg = Release|Any CPU
204+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Mono Release|Mixed Platforms.Build.0 = Release|Any CPU
205+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Release|Any CPU.ActiveCfg = Release|Any CPU
206+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Release|Any CPU.Build.0 = Release|Any CPU
207+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
208+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
187209
EndGlobalSection
188210
GlobalSection(SolutionProperties) = preSolution
189211
HideSolutionNode = FALSE
@@ -196,5 +218,6 @@ Global
196218
{273E4575-4054-4578-9D14-8D4E640A365F} = {0F277539-E9D7-4A06-A731-D525D9AFCE54}
197219
{5CF9DB92-53DE-488E-82F9-4C3F867516B2} = {D54BB20B-57E8-4D4F-BD9D-CF284CBFAB3B}
198220
{BE64E341-7D99-43D9-A0D2-A38E977B7D97} = {E7B39EAD-EA32-4011-845A-C949A336389A}
221+
{AF935BDD-673A-4928-9CBD-0BF0889DE1AC} = {0F277539-E9D7-4A06-A731-D525D9AFCE54}
199222
EndGlobalSection
200223
EndGlobal

src/NuGet.Server.V2/Controllers/NuGetODataController.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ public virtual HttpResponseMessage DeletePackage(string id, string version)
293293
if (requestedPackage == null || !requestedPackage.Listed)
294294
{
295295
// Package not found
296-
return Request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("'Package {0} {1}' Not found.", id, version));
296+
return CreateStringResponse(HttpStatusCode.NotFound, string.Format("'Package {0} {1}' Not found.", id, version)); // Request.CreateErrorResponse(HttpStatusCode.NotFound, string.Format("'Package {0} {1}' Not found.", id, version));
297297
}
298298

299299
// Make sure the user can access this package
@@ -304,9 +304,8 @@ public virtual HttpResponseMessage DeletePackage(string id, string version)
304304
}
305305
else
306306
{
307-
return Request.CreateErrorResponse(HttpStatusCode.Forbidden, string.Format("Access denied for package '{0}', version '{1}'.", requestedPackage.Id,version));
307+
return CreateStringResponse(HttpStatusCode.Forbidden, string.Format("Access denied for package '{0}', version '{1}'.", requestedPackage.Id,version));
308308
}
309-
310309
}
311310

312311
/// <summary>
@@ -348,7 +347,7 @@ public virtual async Task<HttpResponseMessage> UploadPackage()
348347
}
349348
else
350349
{
351-
retValue = Request.CreateErrorResponse(HttpStatusCode.Forbidden, string.Format("Access denied for package '{0}'.", package.Id));
350+
retValue = CreateStringResponse(HttpStatusCode.Forbidden, string.Format("Access denied for package '{0}'.", package.Id));
352351
}
353352

354353
package = null;
@@ -357,13 +356,19 @@ public virtual async Task<HttpResponseMessage> UploadPackage()
357356
File.Delete(temporaryFile);
358357
}
359358
catch (Exception)
360-
{
361-
retValue = Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Could not remove temporary upload file.");
359+
{
360+
retValue = CreateStringResponse(HttpStatusCode.InternalServerError, "Could not remove temporary upload file.");
362361
}
363362

364363
return retValue;
365364
}
366365

366+
protected HttpResponseMessage CreateStringResponse(HttpStatusCode statusCode, string response)
367+
{
368+
var responseMessage = new HttpResponseMessage(statusCode) { Content = new StringContent(response) };
369+
return responseMessage;
370+
}
371+
367372
private string GetApiKeyFromHeader()
368373
{
369374
string apiKey = null;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Net.Http;
5+
using System.Web.Http;
6+
using NuGet.Server.V2;
7+
using System.Web.Http.Routing;
8+
9+
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(NuGet.Server.App_Start.NuGetODataConfig), "Start")]
10+
namespace NuGet.Server.App_Start
11+
{
12+
public static class NuGetODataConfig
13+
{
14+
public static void Start()
15+
{
16+
ServiceResolver.SetServiceResolver(new DefaultServiceResolver());
17+
18+
var config = GlobalConfiguration.Configuration;
19+
20+
NuGetV2WebApiEnabler.UseNuGetV2WebApiFeed(config, "NuGetDefault", "nuget", "PackagesOData");
21+
22+
config.Routes.MapHttpRoute(
23+
name: "NuGetDefault_ClearCache",
24+
routeTemplate: "nuget/clear-cache",
25+
defaults: new { controller = "PackagesOData", action = "ClearCache" },
26+
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
27+
);
28+
29+
}
30+
}
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.Net.Http;
2+
using System.Web.Http;
3+
using NuGet.Server.V2;
4+
using System.Web.Http.Routing;
5+
6+
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof($rootnamespace$.App_Start.NuGetODataConfig), "Start")]
7+
8+
namespace $rootnamespace$.App_Start {
9+
public static class NuGetODataConfig {
10+
public static void Start()
11+
{
12+
ServiceResolver.SetServiceResolver(new DefaultServiceResolver());
13+
14+
var config = GlobalConfiguration.Configuration;
15+
16+
NuGetV2WebApiEnabler.UseNuGetV2WebApiFeed(config, "NuGetDefault", "nuget", "PackagesOData");
17+
18+
config.Routes.MapHttpRoute(
19+
name: "NuGetDefault_ClearCache",
20+
routeTemplate: "nuget/clear-cache",
21+
defaults: new { controller = "PackagesOData", action = "ClearCache" },
22+
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) }
23+
);
24+
25+
}
26+
}
27+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Net;
5+
using System.Net.Http;
6+
using System.Web.Http;
7+
using NuGet.Server.Core.Infrastructure;
8+
9+
namespace NuGet.Server.DataServices
10+
{
11+
public class PackagesODataController : NuGet.Server.V2.Controllers.NuGetODataController
12+
{
13+
private static IServerPackageRepository Repository
14+
{
15+
get
16+
{
17+
// It's bad to use the container directly but we aren't in the loop when this
18+
// class is created
19+
return ServiceResolver.Resolve<IServerPackageRepository>();
20+
}
21+
}
22+
23+
private static IPackageAuthenticationService AuthenticationService
24+
{
25+
get
26+
{
27+
// It's bad to use the container directly but we aren't in the loop when this
28+
// class is created
29+
return ServiceResolver.Resolve<IPackageAuthenticationService>();
30+
}
31+
}
32+
33+
public PackagesODataController()
34+
:base (Repository, AuthenticationService)
35+
{
36+
_maxPageSize = 100;
37+
}
38+
39+
[HttpGet]
40+
// Exposed through ordinary Web API route. Bypasses OData pipeline.
41+
public HttpResponseMessage ClearCache()
42+
{
43+
if (this.RequestContext.IsLocal)
44+
{
45+
_serverRepository.ClearCache();
46+
return CreateStringResponse(HttpStatusCode.OK, "Server cache has been cleared.");
47+
}
48+
else
49+
{
50+
return CreateStringResponse(HttpStatusCode.Forbidden, "Clear cache is only supported for local requests.");
51+
}
52+
}
53+
54+
}
55+
}

src/NuGet.Server/Core/DefaultServiceResolver.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using NuGet.Server.Core.Infrastructure;
66
using NuGet.Server.Core.Logging;
77
using NuGet.Server.Infrastructure;
8-
using NuGet.Server.Publishing;
98

109
namespace NuGet.Server
1110
{
@@ -15,7 +14,6 @@ public class DefaultServiceResolver
1514
private readonly IHashProvider _hashProvider;
1615
private readonly IServerPackageRepository _packageRepository;
1716
private readonly IPackageAuthenticationService _packageAuthenticationService;
18-
private readonly IPackageService _packageService;
1917
private readonly ISettingsProvider _settingsProvider;
2018

2119
public DefaultServiceResolver()
@@ -28,7 +26,6 @@ public DefaultServiceResolver()
2826

2927
_packageAuthenticationService = new PackageAuthenticationService();
3028

31-
_packageService = new PackageService(_packageRepository, _packageAuthenticationService);
3229
}
3330

3431
public object Resolve(Type type)
@@ -48,10 +45,6 @@ public object Resolve(Type type)
4845
return _packageAuthenticationService;
4946
}
5047

51-
if (type == typeof(IPackageService))
52-
{
53-
return _packageService;
54-
}
5548

5649
return null;
5750
}

src/NuGet.Server/Core/SemanticVersionExtensions.cs

Lines changed: 0 additions & 26 deletions
This file was deleted.

src/NuGet.Server/DataServices/Packages.svc

Lines changed: 0 additions & 3 deletions
This file was deleted.

0 commit comments

Comments
 (0)