这可能是一个虚拟问题,但我找不到明确的指示.我在MVC3 Web应用程序中有一个POCO类,其唯一目的是管理服务器中某些文件的备份.通常,它会创建一个备份并将文件名返回给控制器,控制器会发送一封电子邮件,其中包含用于下载它的URL.这工作正常,但我无法构建要发送的绝对URL.无论我使用哪种功能,我总是得到一个相对的URL,比如/Backup/TheFile.zip,而不是http://www.somesite.com/Backup/TheFile.zip.我试过了:
VirtualPathUtility.ToAbsolute("~/Backup/SomeFile.zip");
HttpRuntime.AppDomainAppVirtualPath + "/Backup/SomeFile.zip";
Url.Content("~/Backup/SomeFile.zip");
Run Code Online (Sandbox Code Playgroud)
但它们都返回类似/Backup/SomeFile.zip的东西.任何的想法?
我已将ASP.NET核心Web API部署到Azure,我可以使用Swagger或像Fiddler这样的Web调试器访问其端点.在这两种情况下(Swagger中的相同来源,使用来自我的计算机的Fiddler的不同来源),当访问API时,我得到了预期的结果,在我的下面启用了CORS Startup.cs:
添加services.AddCors();到ConfigureServices.
将中间件添加到Configure:我知道这里的顺序很重要(ASP.NET 5:响应中的Access-Control-Allow-Origin),所以我将此调用放在方法的顶部,只是在记录或诊断中间件之前; 这是我的完整方法:
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory,
IDatabaseInitializer databaseInitializer)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
loggerFactory.AddNLog();
// to serve up index.html
app.UseDefaultFiles();
app.UseStaticFiles();
// http://www.talkingdotnet.com/aspnet-core-diagnostics-middleware-error-handling/
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
// CORS
// https://docs.asp.net/en/latest/security/cors.html
app.UseCors(builder =>
builder.WithOrigins("http://localhost:4200", "http://www.myclientserver.com")
.AllowAnyHeader()
.AllowAnyMethod());
app.UseOAuthValidation();
app.UseOpenIddict();
app.UseMvc();
databaseInitializer.Seed().GetAwaiter().GetResult();
env.ConfigureNLog("nlog.config");
// swagger
app.UseSwagger();
app.UseSwaggerUi();
}
Run Code Online (Sandbox Code Playgroud)
该localhostCORS是开发过程中使用,并指Angular2 CLI应用程序.CORS在本地工作正常,我的客户端和API应用程序位于同一个本地主机上的不同端口上,所以这是"真正的"交叉起源(我正在评论这个,因为我在这里找到的建议:https://weblog.west -wind.com/windts/2016/Sep/26/ASPNET-Core-and-CORS-Gotchas:帖子的作者注意到响应中的CORS头只在实际需要时发送,即在真正的跨源环境中).
使用Fiddler我可以成功访问远程API,但我没有Access-Control-Allow-Origin头.因此,当从浏览器(通过我的客户端应用程序)调用API时,即使服务器返回200,AJAX请求也会失败.示例Fiddler请求(成功):
GET http://mywebapisiteurl/api/values HTTP/1.1
User-Agent: Fiddler
Run Code Online (Sandbox Code Playgroud)
响应:
HTTP/1.1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个使用ng-grid和ASP.NET WebAPI的简单工作示例.因此,我从ng-grid示例页面(http://angular-ui.github.io/ng-grid/)中的服务器端分页示例开始; 无论如何,我的网格总是显示空列,即使在调试时我可以确认数据是否正确接收.可能我只是在网格设置中遗漏了一些东西,但我发现的所有样本看起来都与我的相似.有人可以帮忙吗?这是我做的:
更新#1:建议的解决方案似乎有效但仅适用于第1页.每当我移动到新页面或执行需要刷新的任何其他操作时,即使服务器返回数据按预期更改,显示的数据也保持不变.此外,从我发现的所有代码示例中,似乎正确的设置数据的方法只是替换数组成员值而不是清空并再次填充它.我按照https://groups.google.com/forum/#!searchin/angular/nggrid/angular/vUIfHWt4s_4/oU_C9w8j-uMJ的建议尝试了申请,但我得到的结果相同.
只需创建一个新的MVC4应用程序,更新NuGet包并添加angular和ng-grid包.我的假数据模型由Item类表示:
public sealed class Item
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool IsFemale { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我还添加了几个模型来处理分页,过滤和排序各种数据集(我发现更容易有一个共同的分页基础模型-PagedFilter-,以及一些派生模型):
public class PagedFilter
{
private int _nPageSize;
private int _nPageNumber;
public int PageSize
{
get { return _nPageSize; }
set
{
if (value < 1) throw new ArgumentOutOfRangeException("value");
_nPageSize = value;
}
}
public …Run Code Online (Sandbox Code Playgroud) 更新:请阅读本文中的最低解决方案
我有一些关于带插件的MVC4解决方案的新手问题.我google了一下,找到了一些好东西,但它并不完全符合我的要求,所以我在这里要求一些建议.
似乎MVC中类似于widget的插件的最佳解决方案是可移植区域(在MvcContrib包中).我在这里找到了基本的指导:
http://lostechies.com/erichexter/2009/11/01/asp-net-mvc-portable-areas-via-mvccontrib/
以及一些有用的提示:
这篇文章中有更多内容:
这很酷,但遗憾的是我的要求有点不同:
不幸的是,我需要一个动态添加和发现插件的系统,而不是便携式区域的情况,必须由主MVC站点项目引用.我想只是上传一些东西到网站,让它发现并使用新的组件,所以我将使用MEF.
幸运的是,我的插件不会像小部件一样,它可能非常复杂和异构; 相反,它们是必须遵循共同的共享模式的组件.将它们视为专业编辑器:对于每种数据类型,我将提供具有编辑功能的组件:新建,编辑,删除.所以我在考虑插件控制器,它们实现了一个通用接口并提供了New,Edit,Delete等操作.
我必须使用MVC4,将来我必须添加本地化和移动定制.
我必须避免复杂框架的依赖,并尽可能简化代码.
所以,每当我想在这个网站上添加一个新的数据类型进行编辑时,我只想在其插件文件夹中删除一个DLL用于逻辑内容(控制器等),并在正确的位置放置一些视图,以获取网站发现并使用新编辑器.
最终我可以在DLL本身中包含视图(我发现了这个:http://razorgenerator.codeplex.com,本教程:http://www.chrisvandesteeg.nl/2010/11/22/embedding-pre-compiled -razor-views-in-your-dll /,我想我可以使用codeplex razorgenerator,因为它引用的代码与VS2012不兼容),但可能我最好将它们分开(也是因为本地化和移动意识要求); 我正在考虑向我的站点管理区域添加上传机制,您可以在其中上传带有控制器的DLL和带有视图的文件夹的单个zip,然后让服务器解压缩并在需要时存储文件.这将允许我轻松修改视图,而无需再次部署整个加载项.
所以我开始寻找MEF和MVC,但是大多数帖子都引用了MVC2并且不兼容.我有更好的运气,主要集中在Web API,但看起来很有前途和简单:
http://kennytordeur.blogspot.it/2012/08/mef-in-aspnet-mvc-4-and-webapi.html
这基本上将基于MEF的依赖性解析器和控制器工厂添加到"标准"MVC应用程序.无论如何,帖子中的样本指的是单组装解决方案,而我需要部署几个不同的插件.所以我稍微修改了代码,使用指向我的插件文件夹的MEF DirectoryCatalog(而不是AssemblyCatalog),然后创建了一个测试MVC解决方案,在类库中有一个插件.
无论如何,当我尝试加载插件控制器时,框架使用null类型调用我的工厂GetControllerInstance,因此当然MEF无法进行组合.可能我错过了一些明显的东西,但我是MVC 4的新手,欢迎任何建议或有用(符合MVC4标准)的链接.谢谢!
这是基本代码:
public static class MefConfig
{
public static void RegisterMef()
{
CompositionContainer container = ConfigureContainer();
ControllerBuilder.Current.SetControllerFactory(new MefControllerFactory(container));
System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver =
new MefDependencyResolver(container);
}
private static CompositionContainer ConfigureContainer()
{
//AssemblyCatalog assemblyCatalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
DirectoryCatalog catalog = new DirectoryCatalog(
HostingEnvironment.MapPath("~/Plugins"));
CompositionContainer container = new CompositionContainer(catalog);
return … 我正在尝试使用许多插件创建一个MVC4 Web应用程序,即基本上通过MEF导出的控制器以及解压缩到其正确位置的内容文件.我找到了很多关于MVC插件的资料,主要涉及领域,但我不得不放弃MvcContrib,这将是最明显的解决方案,因为它似乎不再开发,显示了最新的MVC位的一些问题,我也喜欢这种架构的最简单复杂的实现.
因此我的要求是:
a)一个基于MEF的MVC插件解决方案,我只是在我的站点中删除一个包以供它使用,理想情况下甚至没有重启.这意味着将插件存储在与Bin不同的文件夹中,这也提供了更好的隔离.
b)符合IoC工具的解决方案比仅由MEF完成的解决方案更完整.我倾向于使用Autofac,因为它与MEF和MVC4(此时为RC)集成.
除了像视图这样的内容之外,其基本任务是让MVC在MEF插件中定位控制器并实例化它们,所以我需要一个控制器工厂.我在这里发现了一篇很好的文章:http://kennytordeur.blogspot.be/2012/08/mef-in-aspnet-mvc-4-and-webapi.html(我联系了Kenny关于这一点,我感谢他的指点我到一些路由问题).作者还将他的代码包装成一个方便的nuget包(MEF.MVC4).无论如何,我发现了一个似乎与路由和名称空间有关的问题:当遇到一个到插件控制器的路由时,MEF控制器工厂的GetControllerInstance方法得到一个空的controllerType,最终导致404.我想我可能找到了罪魁祸首通过阅读这些帖子:
http://blog.davebouwman.com/2011/12/08/asp-net-mvc3-and-404s-for-area-controllers/
和
自定义控制器工厂,ASP.NET MVC的依赖注入/结构图问题
我想(但我可能错了)问题出在路由约定和插件区域控制器命名空间中:插件控制器的命名空间不在主机Web的同一"根"中.该帖子中提出的解决方案只是为Web应用程序添加了一条新路径,但这不适用于区域作为插件工作的动态添加到主机应用程序的解决方案.我的主机网络应用程序必须保持不知道插件,这当然应该是一个相当普遍的要求,但我找不到明显的解决方案.
您可以快速创建repro解决方案,以便按照以下步骤查看我的方法的详细信息,或从此处下载:
1)创建一个空白的解决方案.
2)在其中创建一个MVC4 Web应用程序(HostWeb),更新所有NuGet预装的包并添加Mef.MVC4,Autofac MVC 4(RC)和Autofac.Mef.在我的真实应用程序中,我想使用Autofac在构造函数中注入控制器的依赖项.
3)在HostWeb中创建一个Plugins文件夹,并在其中创建一个子文件夹Temp.这将包括使用Temp子文件夹作为卷影副本容器的插件,以便从中加载MEF目录而不是直接从插件加载.这与一些启动代码一起应该让我更新插件而不必重新启动Web应用程序(否则将锁定DLL).启动代码是一个名为PreApplicationInit的类,您可以在Infrastructure文件夹中找到该类(稍微修改自http://shazwazza.com/post/Developing-a-plugin-framework-in-ASPNET-with-medium-trust.aspx).
4)将一个部件区域添加到主机Web并从视图根文件夹中复制_ViewStart文件(并更改布局视图中的现有链接,以便将空白区域添加到路径值,以便它们不会被破坏) .所有插件控制器都将命名空间到名为Parts的区域中.主机Web应用程序有一个没有控制器的区域,只是为插件内容文件准备文件夹结构和路由(视图,将从插件安装程序模块解压缩到正确的位置,而二进制文件将放在插件中).
5)在HostWeb的App_Start中定制MefConfig并添加处理Autofac的IocConfig.然后向全局asax添加对两者的调用:MefConfig.RegisterMef()和IocConfig.RegisterDependencies().
6)在其中创建另一个MVC4 Web应用程序(AlphaPlugin),更新所有NuGet预安装包并添加Autofac MVC 4(RC)和Autofac.Mef.我选择了一个Web应用程序模板(而不是类库),因此我可以使用MVC的所有VS工具,并最终直接在那里进行一些测试.
7)将一个部件区域添加到主机Web,并从views根文件夹中将_ViewStart文件复制到其中.
8)在"部件"区域中添加可导出的控制器.我叫做AlphaController,它只有一个名为Hail的动作方法,它在ViewBag中放入一个字符串并返回默认视图.
9)回到主机,只需在主视图中添加插件控制器动作的链接,即可通过MEF进行测试.
现在,如果我构建所有并将AlphaPlugin.dll二进制文件复制到HostWeb Plugins文件夹中,我希望MVC通过MEF找到它,但随后抛出一个未查找的错误错误,因为我还没有复制主机网络中的任何内容文件.相反,我得到以下内容:
Value cannot be null.
Parameter name: type
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the …Run Code Online (Sandbox Code Playgroud) 我正在使用AngularJS + Twitter Bootstrap和Bootstrap-UI创建一个Web应用程序.当我在按钮上放置工具提示时,它会按预期显示; 但是如果按钮在被单击后被禁用(由底层控制器),并且正在显示工具提示,则工具提示不会被隐藏并永远保留在那里.这是一个复制品:
Plunker:http://embed.plnkr.co/numlaAuLOxh3a03Z7O85/preview
只需将鼠标悬停在按钮上即可显示工具提示,然后单击它.该按钮被禁用,工具提示停留在那里.如何避免此行为并正确隐藏我的提示?
我正在尝试首先使用EF6代码+ MySql进行迁移,但我在以下期间遇到此错误add-migration:
The underlying provider does not support the type 'nvarchar(max)'
Run Code Online (Sandbox Code Playgroud)
因此,即使我在配置中更改了默认连接工厂,因此EF似乎正在尝试将SQLServer类型用于MySql.
我可以用相同的错误消息找到很多问题但是它们似乎都不是最新的或者建议我还没有尝试过的东西.以下是我在MySql的DAL dll中启用迁移的步骤,是否有人可以提示?
(1)添加NuGet 包:
MySql.ConnectorNET.DataMySql.ConnectorNET.Entity(2)在文件中添加MySql 的连接字符串App.config,如:
(connectionStrings)
(add name="MySqlConn"
connectionString="Data Source=127.0.0.1;Port=3306;Database=dummy;User id=***;Password=***;charset=utf8"
providerName="MySql.Data.MySqlClient" /)
(/connectionStrings)
Run Code Online (Sandbox Code Playgroud)
(3)另外,确保NuGet按照规定修改了配置(在我的情况下App.config):
替换默认连接工厂:
(defaultconnectionfactory type ="MySql.Data.Entity.MySqlConnectionFactory,MySql.Data.Entity.EF6"/)
添加MySql提供程序:
(provider invariantname ="MySql.Data.MySqlClient"type ="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version = 6.8.3.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d"/)
将提供程序添加到system.data:
(system.data)(dbproviderfactories)(remove name ="MySQL Data Provider"invariant ="MySql.Data.MySqlClient"/)(add name ="MySQL Data Provider"invariant ="MySql.Data.MySqlClient"description =".用于MySQL的Net Framework数据提供程序"type ="MySql.Data.MySqlClient.MySqlClientFactory,MySql.Data,Version = 6.8.3.0,Culture = neutral,PublicKeyToken = c5687fc88969c44d"/)(/ dbproviderfactories)(/ system.data)
(4)手动添加代码配置类型 …
我试图通过它的Angular包装器使用flow.js(https://github.com/flowjs/flow.js)(https://github.com/flowjs/ng-flow/tree/master/samples/basic)将文件上载到ASP.NET WebAPI 2服务器.无论如何,当我选择一个文件来上传我的WebAPI时,只获得第一个块GET请求,然后没有任何反应:没有POST完成,似乎flow.js没有启动上传.
选择文件时触发的初始GET是:
GET http://localhost:49330/api/upload?flowChunkNumber=1&flowChunkSize=1048576&flowCurrentChunkSize=4751&flowTotalSize=4751&flowIdentifier=4751-ElmahMySqlsql&flowFilename=Elmah.MySql.sql&flowRelativePath=Elmah.MySql.sql&flowTotalChunks=1 HTTP/1.1
Host: localhost:49330
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Accept: */*
Referer: http://localhost:49330/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,it;q=0.6
Run Code Online (Sandbox Code Playgroud)
响应是:
HTTP/1.1 202 Accepted
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcNDViXFRlc3RcVXBUZXN0XFVwVGVzdFxhcGlcdXBsb2Fk?=
X-Powered-By: ASP.NET
Date: Fri, 17 Apr 2015 08:02:56 GMT
Content-Length: 0
Run Code Online (Sandbox Code Playgroud)
然后,不再发出请求.
由于似乎没有最新的WebAPI示例,但只有零散的帖子,我为像我这样的新手创建了一个虚拟的repro解决方案,可以从http://1drv.ms/1CSF5jq下载:它是一个ASP.NET WebAPI 2在添加相应的API控制器后,我将上传代码放在主视图中的解决方案.只需按F5并尝试上传文件即可.您可以在中找到API控制器UploadController.cs.
相关的代码部分是:
a)客户端:类似于ng-flow页面的快速启动示例的页面:
<div class="row">
<div class="col-md-12"> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 GitHub 包(此处为文档)推送然后使用 NuGet 包。作为一个新手,经过一些试验后,我设法将示例 NuGet 包推送到公共 GitHub 存储库。
然而,我错过了最后一部分,即从一些 Visual Studio 项目中使用包。当我尝试添加包时,我首先收到“正在为...恢复包”通知,然后是错误“无法加载源的服务索引...:输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符”。
因此,似乎我的 NuGet 端点没有按预期配置,但我找不到明确的方向。为了帮助像我这样的新手从 GPR 开始,并详细说明我的程序,以便读者可以发现我的错误,以下是我到目前为止所学到的:
在使用 GPR 之前,您必须在您的 GitHub 帐户中创建一个令牌。
RepositoryUrl和RepositoryType属性分别设置为.csproj目标存储库 URL 和git,例如:<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!-- omissis ... -->
<RepositoryUrl>https://github.com/USERNAME/PROJECTNAME</RepositoryUrl>
<RepositoryType>git</RepositoryType>
</PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)
dotnet pack NAME.csproj -c Release -p:IncludeSymbols=true -p:SymbolPackageFormat=snupkg
Run Code Online (Sandbox Code Playgroud)
其中-c选择配置。有关更多信息,请参阅创建 snupkg,以及dotnet pack 参考。
我正在尝试使用凭证流创建一个使用OpenIdDict保护的.NET Core Web API的Angular2 SPA.在为这个问题创建一个repro解决方案时,我还详细介绍了自述文件中的所有步骤,所以希望这篇文章对像我这样的新手有用.请在这些存储库中找到完整的repro解决方案:
服务器端(.NET Core + OpenIdDict),详细说明如何构建自己的:https://github.com/Myrmex/repro-oidang
客户端(Angular2):https://github.com/Myrmex/repro-angoid
至于服务器端,我按照OpenIdDict提供的关于此流程的示例(https://github.com/openiddict/openiddict-samples/blob/master/samples/PasswordFlow).以下是最相关的位Startup:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddEntityFrameworkSqlServer()
.AddDbContext<CatalogContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Catalog")))
.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("Catalog")));
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddOpenIddict<ApplicationDbContext>()
.DisableHttpsRequirement()
.EnableTokenEndpoint("/connect/token")
.EnableLogoutEndpoint("/connect/logout")
.EnableUserinfoEndpoint("/connect/userinfo")
.AllowPasswordFlow()
.AllowRefreshTokenFlow()
.AddEphemeralSigningKey();
services.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.ContractResolver =
new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver();
});
// add my services
// ...
services.AddTransient<IDatabaseInitializer, DatabaseInitializer>();
services.AddSwaggerGen();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory,
IDatabaseInitializer databaseInitializer)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug(); …Run Code Online (Sandbox Code Playgroud) angularjs ×3
c# ×3
angular ×2
mef ×2
asp.net ×1
asp.net-core ×1
asp.net-mvc ×1
autofac ×1
azure ×1
cors ×1
flow-js ×1
github ×1
javascript ×1
mysql ×1
ng-grid ×1
nuget ×1
openiddict ×1
typescript ×1