小编Zde*_*něk的帖子

打包和部署Symfony网站

我是Symfony的新手,来自.NET世界.使用Symfony(4)文档,我设法创建了简单的网站.现在我想把它付诸实践,但我正在努力寻找任何有用的信息我应该怎么做才能"打包"所有必要的东西并进行部署.确实,有一个描述部署的页面(如何部署Symfony应用程序),但我发现它缺乏以下信息:

  • 包含/排除的内容(显然我不想打包dev依赖项,部署composer文件似乎也没有任何意义)
  • 要改变什么(有.env文件 - 包含APP_ENVAPP_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):

  • 我正在使用git
  • 托管能够从调用的git分支部署production(每当我推送到这个分支,它调用composer install --no-dev)
  • 配置公共目录名称是在 composer.json

额外配置示例composer.json:

"extra": {
    "symfony": {
        "allow-contrib": …
Run Code Online (Sandbox Code Playgroud)

php package symfony

12
推荐指数
1
解决办法
967
查看次数

WebAPI DataMember通过application/x-www-form-urlencoded进行de/serial化时未使用的名称

在处理HTTP POST表单请求时,已经花了几个小时尝试解决忽略Name属性的问题.DataMemberAttributeContent-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)

(注意我实际上使用的是模型类型,而不仅仅是我控制器中的接口) …

.net c# asp.net asp.net-web-api

9
推荐指数
1
解决办法
1530
查看次数

Newtonsoft.Json 反序列化基准测试:来自流和字符串

我对如何使用Newtonsoft.Json反序列化 HTTP 响应 JSON 有效负载的两种方法的性能(速度、内存使用)比较感兴趣。

我知道Newtonsoft.Json 的使用流的性能提示,但我想了解更多并有确切的数字。我已经使用BenchmarkDotNet编写了简单的基准测试,但我对结果有点困惑(参见下面的数字)。

我得到了什么:

  • 从流中解析总是更快,但也不是很多
  • 使用字符串作为输入时,解析小型和“中型”JSON 具有更好或相同的内存使用率
  • 对于大型 JSON(字符串本身以 LOH 结尾),内存使用情况开始出现显着差异

我还没有时间进行适当的分析,我对流方法的内存开销感到有点惊讶(如果没有错误)。完整代码在这里

  • 我的做法正确吗?(使用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)

c# json.net deserialization benchmarkdotnet

7
推荐指数
1
解决办法
3551
查看次数

无法从程序集"Not.Containing.Type.A"加载类型"A"

编辑:我没有提到一个重要的事情 - 加载我的程序集的应用程序实际上不在同一目录(与其他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)

我可以在列表中清楚地看到我想要的装配.

没有程序集重定向(据我所知,这仅影响版本).程序集的版本是正确的.

我还应该寻找什么?

.net c# .net-assembly

6
推荐指数
1
解决办法
846
查看次数

C#FP:验证和执行错误处理功能方式 - 改进空间?

我是C#中功能性思维方式的新手(嗯......不仅限于语言).让我们说有方法:

T LoadRecord<T>(int id)
Run Code Online (Sandbox Code Playgroud)

概念

1.验证

当给出无效输入时,我应该返回类似的内容Either<IEnumerable<ValidationError>, T>.

2.执行

当调用可能抛出的DB/API/...时,我应该返回Either<Exception, T>.

3.一些或没有记录

因为入境可能存在,也可能不存在,我正在回归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)

c# functional-programming optional either

6
推荐指数
1
解决办法
163
查看次数

如何在 csproj 中处理包引用的不同方法

到目前为止,我一直使用属性来控制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)

c# csproj .net-core

0
推荐指数
1
解决办法
1万
查看次数