gpt4 book ai didi

owin - HelloWorldComponent 和 System.Func`2 之间无法进行转换[System.Collections.Generic.IDictionary`2//参数名称 : signature

转载 作者:行者123 更新时间:2023-12-01 22:38:39 24 4
gpt4 key购买 nike

我正在学习 Scott Allen 在 Pluralsight 上的 MVC 5 基础类(class)

我在下面的代码中的“using (WebApp.Start(uri))”处收到错误。

错误是

An unhandled exception of type 'System.ArgumentException' occurred in Microsoft.Owin.dll
System.ArgumentException was unhandled
HResult=-2147024809
Message=No conversion available between ConsoleApplication1.HelloWorldComponent and System.Func`2[System.Collections.Generic.IDictionary`2[System.String,System.Object],System.Threading.Tasks.Task].
Parameter name: signature
Source=Microsoft.Owin
ParamName=signature
StackTrace:
at Microsoft.Owin.Builder.AppBuilder.Convert(Type signature, Object app)
at Microsoft.Owin.Builder.AppBuilder.BuildInternal(Type signature)
at Microsoft.Owin.Builder.AppBuilder.Build(Type returnType)
at Microsoft.Owin.Hosting.ServerFactory.ServerFactoryAdapter.Create(IAppBuilder builder)
at Microsoft.Owin.Hosting.Engine.HostingEngine.StartServer(StartContext context)
at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext context)
at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options)
at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options)
at Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider services, StartOptions options)
at Microsoft.Owin.Hosting.WebApp.Start(StartOptions options)
at Microsoft.Owin.Hosting.WebApp.Start[TStartup](StartOptions options)
at Microsoft.Owin.Hosting.WebApp.Start[TStartup](String url)
at ConsoleApplication1.Program.Main(String[] args) in e:\EShared\Dev2015\WebAppScottAllen\ConsoleApplication1\ConsoleApplication1\Program.cs:line 16
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:

代码是

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Owin.Hosting;
using Owin;
namespace ConsoleApplication1
{
using AppFunc = Func<IDictionary<string, object>, Task>;
class Program
{
static void Main(string[] args)
{
string uri = "http://localhost:8080";
using (WebApp.Start<Startup>(uri)) // Katana Please start, using the configuration from the Startup class and listening on the port given by the uri
{
Console.WriteLine("Started!");
Console.ReadKey();
Console.WriteLine("Stopping!");
}
}
}

public class Startup
{
public void Configuration(IAppBuilder app)
{
app.Use<HelloWorldComponent>();
}
}

public class HelloWorldComponent
{
AppFunc _next;
public HelloWorldComponent(AppFunc next)
{
_next = next;
}

// Katana uses reflection to find this Invoke function that matches the AppFunc signature
public Task Invoke(IDictionary<string, object> environment)
{
var response = environment["owin.ResponseBody"] as Stream;

using (var writer = new StreamWriter(response))
{
return writer.WriteAsync("Hello");
}
}
}
}

packages.config 是

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Owin" version="3.0.1" targetFramework="net451" />
<package id="Microsoft.Owin.Diagnostics" version="3.0.1" targetFramework="net451" />
<package id="Microsoft.Owin.Host.HttpListener" version="3.0.1" targetFramework="net451" />
<package id="Microsoft.Owin.Host.SystemWeb" version="3.0.1" targetFramework="net451" />
<package id="Microsoft.Owin.Hosting" version="3.0.1" targetFramework="net451" />
<package id="Owin" version="1.0" targetFramework="net451" />
</packages>

我想知道没有用来获取此消息,所以我想知道可以更改什么

最佳答案

有一种新的方法来编写我们的中间件组件,如下所示:

public class HelloWorldComponent : OwinMiddleware
{
public HelloWorldComponent(OwinMiddleware next) : base(next) { }

public override Task Invoke(IOwinContext context)
{
return context.Response.WriteAsync("Hello, World!");
}
}

具体来说,构造函数必须接受 OwinMiddleware 引用作为其第一个参数,否则您会收到错误,因为 ctor 签名与当前 Owin 所期望的不匹配实现。

此外,请考虑以下参数化用法:

    var param1 = "Hello, World!";
appBuilder.Use<HelloWorldComponent>(param1)

为了正确支持这一点,您需要修改构造函数签名:

public class HelloWorldComponent : OwinMiddleware
{
public HelloWorldComponent(OwinMiddleware next) : base(next) { }

public override Task Invoke(IOwinContext context, string param1)
{
return context.Response.WriteAsync(param1);
}
}

因此,允许我们通过 Use() 的 params 数组参数化我们的中间件。

关于owin - HelloWorldComponent 和 System.Func`2 之间无法进行转换[System.Collections.Generic.IDictionary`2//参数名称 : signature,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29803698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com