我是Symfony的新手,来自.NET世界.使用Symfony(4)文档,我设法创建了简单的网站.现在我想把它付诸实践,但我正在努力寻找任何有用的信息我应该怎么做才能"打包"所有必要的东西并进行部署.确实,有一个描述部署的页面(如何部署Symfony应用程序),但我发现它缺乏以下信息:
dev
依赖项,部署composer
文件似乎也没有任何意义).env
文件 - 包含APP_ENV
和APP_SECRET
- 我在哪里使用这些值?)www
进行公开演示,我是否必须在重命名public
目录之前更改/配置一些内容www
?.htaccess
为不通过PHP路由images/css/js?我目前的项目结构是:
+ bin
+ config
+ public
+ css
- index.php
+ src
+ Controller
- Kernel.php
+ templates
+ var
+ vendor
- .env
- .gitignore
- composer.json
- composer.lock
- symfony.lock
Run Code Online (Sandbox Code Playgroud)
编辑(2018-07-17):
production
(每当我推送到这个分支,它调用composer install --no-dev
)composer.json
额外配置示例composer.json
:
"extra": {
"symfony": {
"allow-contrib": …
Run Code Online (Sandbox Code Playgroud) 在处理HTTP POST表单请求时,已经花了几个小时尝试解决忽略Name
属性的问题.DataMemberAttribute
Content-Type: application/x-www-form-urlencoded
我Microsoft.AspNet.WebApi 5.2.3
在.NET 4.5上运行应用程序,由IIS托管.
我有这个模型(演示):
// library
public interface IPayload
{
string DataId { get; set; }
int RelationId { get; set; }
}
// web app project
[DataContract]
public class MyPayload : IPayload
{
[Required]
[DataMember(Name = "id")]
public string DataId { get; set; }
[Required]
[DataMember(Name = "rel")]
public int RelationId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我有控制器:
[HttpPost]
[Route("~/api/stuff")]
public async Task<HttpResponseMessage> DoMagic(MyPayload payload)
{
// ... breakpoint
}
Run Code Online (Sandbox Code Playgroud)
(注意我实际上使用的是模型类型,而不仅仅是我控制器中的接口) …
我对如何使用Newtonsoft.Json反序列化 HTTP 响应 JSON 有效负载的两种方法的性能(速度、内存使用)比较感兴趣。
我知道Newtonsoft.Json 的使用流的性能提示,但我想了解更多并有确切的数字。我已经使用BenchmarkDotNet编写了简单的基准测试,但我对结果有点困惑(参见下面的数字)。
我得到了什么:
我还没有时间进行适当的分析,我对流方法的内存开销感到有点惊讶(如果没有错误)。完整代码在这里。
MemoryStream
;模拟HttpResponseMessage
及其内容;...)我准备MemoryStream
在基准测试中反复使用:
[GlobalSetup]
public void GlobalSetup()
{
var resourceName = _resourceMapping[typeof(T)];
using (var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
_memory = new MemoryStream();
resourceStream.CopyTo(_memory);
}
_iterationRepeats = _repeatMapping[typeof(T)];
}
Run Code Online (Sandbox Code Playgroud)
[Benchmark(Description = "Stream d13n")]
public async Task DeserializeStream()
{
for (var i = 0; i < _iterationRepeats; i++) …
Run Code Online (Sandbox Code Playgroud) 编辑:我没有提到一个重要的事情 - 加载我的程序集的应用程序实际上不在同一目录(与其他dll).在摆弄Fusion日志之后,我注意到加载的dll
行为与我之前的想法不同.(是的,我应该先RTFM,对我感到羞耻)
C:\Test\appLoadingStuff.exe
C:\Lib\Acme.Application.dll
C:\Lib\Acme.Data.dll
.NET正在探测应用程序库(除了GAC和东西;加载应用程序的目录是 - C:\Test\
),并不关心dll
存储加载的位置(其他目录).
在使用.NET框架时,我发现自己得到了一个ReflectionTypeLoadException
例外:
System.TypeLoadException
无法加载一个或多个请求的类型.检索LoaderExceptions属性以获取更多信息.
无法从程序集'Acme.Data.Dao,Version = 1.1.0.4,Culture = neutral,PublicKeyToken = null'加载类型'Acme.Data.Foo'.":"Acme.Data.Foo
为简单起见,我有3个组件:
Acme.Application
我的主要装配Acme.Data
我的数据对象(由第一个引用)Acme.Data.Dao
我的数据访问对象(由第一个引用)还有另一个应用程序,实际上加载我的主程序集.所有.dll
文件都在同一目录中.
正如您所料,类型Acme.Data.Foo
是生活在组装中Acme.Data
.尽管如此,.NET正试图在另一个程序集中找到它Acme.Data.Dao
- 它失败了,因为类型不存在.
我无法弄清楚是什么让.NET在错误的程序集中寻找特定类型.在汇编时访问类型时会立即抛出异常:
System.Reflection.RuntimeAssembly assembly = Assembly.LoadFile("C:\Lib\Acme.Application.dll")
var types = assembly.GetTypes(); // -> explodes
Run Code Online (Sandbox Code Playgroud)
当我尝试使用以下方法检查引用的程序集
assembly.GetReferencedAssemblies()
Run Code Online (Sandbox Code Playgroud)
我可以在列表中清楚地看到我想要的装配.
没有程序集重定向(据我所知,这仅影响版本).程序集的版本是正确的.
我还应该寻找什么?
我是C#中功能性思维方式的新手(嗯......不仅限于语言).让我们说有方法:
T LoadRecord<T>(int id)
Run Code Online (Sandbox Code Playgroud)
当给出无效输入时,我应该返回类似的内容Either<IEnumerable<ValidationError>, T>
.
当调用可能抛出的DB/API/...时,我应该返回Either<Exception, T>
.
因为入境可能存在,也可能不存在,我正在回归Option<T>
.
如果你将上述所有内容结合起来,你最终会得到:
Either<IEnumerable<ValidationError>, Either<Exception, Option<T>> LoadRecord<T>(int id)
Run Code Online (Sandbox Code Playgroud)
我可以介绍如下类型:
Validation<T>
(〜: Either<IEnumerable<ValidationError>, T>
)Result<T>
(〜: Either<Exception, T>
)现在,我的方法的签名看起来像:
Validation<Result<Option<T>>> LoadRecord<T>(int id)
Run Code Online (Sandbox Code Playgroud)
return LoadRecord<User>(1).Match(
vl => BadRequest(),
vr => vr.Match(
el => StatusCode(500),
er => er.Some(u => Ok(u))
.None(NotFound());
Run Code Online (Sandbox Code Playgroud)
try
{
var u = LoadRecord<User>(id);
if (u == null)
{
return NotFound();
}
return Ok(u);
}
catch …
Run Code Online (Sandbox Code Playgroud) 到目前为止,我一直使用属性来控制PackageReference
(第一个示例)的资产依赖性。最近,在使用 NuGet 包管理器(在 VS 中)之后,我最终得到了完全不同的 XML。
两者都控制相同的东西,任何人都可以帮助我理解差异和需要有两种方法来控制类似的东西吗?
.NET Core 的 csproj 格式的新增内容 > PackageReference
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" PrivateAssets="..." IncludeAssets="..." ExcludeAssets="..." />
Run Code Online (Sandbox Code Playgroud)
项目文件中的包引用 (PackageReference) > 控制依赖项资产:
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0">
<IncludeAssets>...</IncludeAssets>
<ExcludeAssets>...</ExcludeAssets>
<PrivateAssets>...</PrivateAssets>
</PackageReference>
Run Code Online (Sandbox Code Playgroud)