-
Notifications
You must be signed in to change notification settings - Fork 10.4k
Closed
Labels
area-networkingIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractionsIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractionsgood first issueGood for newcomers.Good for newcomers.help wantedUp for grabs. We would accept a PR to help resolve this issueUp for grabs. We would accept a PR to help resolve this issue
Milestone
Description
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
Since void ICollection<KeyValuePair<string, object>>.CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
is not implemented here.
This causes problems with Linq methods used on Environment
.
If we use something like Microsoft.Owin.Diagnostics
's UseErrorPage
with ShowEnvironment we get a crash in the view rendering.
This is because the view uses
@foreach (var kv in Model.Environment.OrderBy(kv => kv.Key))
{
<tr>
<td>@kv.Key</td>
<td>@kv.Value</td>
</tr>
}
Using OrderBy
causes CopyTo
to be invoked.
System.NotImplementedException: The method or operation is not implemented.
at Microsoft.AspNetCore.Owin.OwinEnvironment.System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.CopyTo(KeyValuePair`2[] array, Int32 arrayIndex)
at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length)
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext()
at My.Owin.Test.OwinStartUp.StartUp.<Configuration2>b__0_1(IOwinContext context)
at Microsoft.Owin.Diagnostics.ErrorPageMiddleware.Invoke(IDictionary`2 environment) in /_/src/Microsoft.Owin.Diagnostics/ErrorPageMiddleware.cs:line 59
Note this is on net6.0.9 with Owin 4.2.2
Expected Behavior
I would expect CopyTo to be implemented so that Linq queries against Environment work as expected, possibly by using the existing GetEnumerator function.
void ICollection<KeyValuePair<string, object>>.CopyTo(KeyValuePair<string, object>[] array, int arrayIndex)
{
foreach(var kv in this)
{
array[arrayIndex++] = kv;
if (arrayIndex == array.Length) break;
}
}
Steps To Reproduce
https://github.com/CZEMacLeod/AspNetCoreOwinEnvironmentIssue
using Microsoft.Owin.Builder;
using Owin;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseOwin(setup => setup(next =>
{
var owinAppBuilder = new AppBuilder();
owinAppBuilder.Run(async context =>
{
context.Response.ContentType = "text/plain";
await context.Response.WriteAsync("Environment\r\n");
foreach (var kv in context.Environment
//.AsEnumerable()
//.Select(kv => new KeyValuePair<string, object?>(kv.Key, kv.Value))
//.ToList()
.OrderBy(kv => kv.Key))
{
await context.Response.WriteAsync(kv.Key);
await context.Response.WriteAsync(" : ");
await context.Response.WriteAsync(kv.Value?.ToString() ?? String.Empty);
await context.Response.WriteAsync("\r\n");
}
});
return owinAppBuilder.Build<Func<IDictionary<string, object>, Task>>();
}));
app.Run();
Exceptions (if any)
System.NotImplementedException: The method or operation is not implemented.
at Microsoft.AspNetCore.Owin.OwinEnvironment.System.Collections.Generic.ICollection<System.Collections.Generic.KeyValuePair<System.String,System.Object>>.CopyTo(KeyValuePair`2[] array, Int32 arrayIndex)
at System.Collections.Generic.EnumerableHelpers.ToArray[T](IEnumerable`1 source, Int32& length)
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext()
at Program.<>c.<<<Main>$>b__0_2>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Owin.WebSocketAcceptAdapter.<>c__DisplayClass6_0.<<AdaptWebSockets>b__0>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
at Microsoft.WebTools.BrowserLink.Net.BrowserLinkMiddleware.ExecuteWithFilterAsync(IHttpSocketAdapter injectScriptSocket, String requestId, HttpContext httpContext)
at Microsoft.AspNetCore.Watch.BrowserRefresh.BrowserRefreshMiddleware.InvokeAsync(HttpContext context)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
The program '[101316] OwinEnvironmentIssue.exe' has exited with code 4294967295 (0xffffffff).
.NET Version
7.0.100-preview.7.22377.5
Anything else?
Microsoft.AspNetCore.App 6.0.9
net6.0
VS2022 17.3.4
Metadata
Metadata
Assignees
Labels
area-networkingIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractionsIncludes servers, yarp, json patch, bedrock, websockets, http client factory, and http abstractionsgood first issueGood for newcomers.Good for newcomers.help wantedUp for grabs. We would accept a PR to help resolve this issueUp for grabs. We would accept a PR to help resolve this issue