diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore/HotChocolate.AspNetCore.csproj b/src/HotChocolate/AspNetCore/src/AspNetCore/HotChocolate.AspNetCore.csproj
index f70b8eba00e..dee9fa3d99d 100644
--- a/src/HotChocolate/AspNetCore/src/AspNetCore/HotChocolate.AspNetCore.csproj
+++ b/src/HotChocolate/AspNetCore/src/AspNetCore/HotChocolate.AspNetCore.csproj
@@ -11,6 +11,7 @@
+
diff --git a/src/HotChocolate/AspNetCore/src/AspNetCore/Resources/index.html b/src/HotChocolate/AspNetCore/src/AspNetCore/Resources/index.html
new file mode 100644
index 00000000000..6c70bcfe4d4
--- /dev/null
+++ b/src/HotChocolate/AspNetCore/src/AspNetCore/Resources/index.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs
index 8f08c4c5d8b..6a098cbcf27 100644
--- a/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs
+++ b/src/HotChocolate/AspNetCore/test/AspNetCore.Tests/GraphQLOverHttpSpecTests.cs
@@ -770,20 +770,13 @@ public async Task New_Query_With_Streams_3()
.Add(response)
.MatchInline(
@"Headers:
- Content-Type: multipart/mixed; boundary=""-""; charset=utf-8
+ Content-Type: text/event-stream; charset=utf-8
-------------------------->
Status Code: OK
-------------------------->
-
- ---
- Content-Type: application/json; charset=utf-8
-
- {""data"":{},""hasNext"":true}
- ---
- Content-Type: application/json; charset=utf-8
-
- {""path"":[],""data"":{""__typename"":""Query""},""hasNext"":false}
- -----
+ {""event"":""next"",""data"":{""data"":{},""hasNext"":true}}
+ {""event"":""next"",""data"":{""path"":[],""data"":{""__typename"":""Query""},""hasNext"":false}}
+ {""event"":""complete""}
");
}
}
diff --git a/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHeaderDictionary.cs b/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHeaderDictionary.cs
new file mode 100644
index 00000000000..c37e5efa041
--- /dev/null
+++ b/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHeaderDictionary.cs
@@ -0,0 +1,105 @@
+using System.Collections;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Azure.Functions.Worker.Http;
+using Microsoft.Extensions.Primitives;
+using Microsoft.Net.Http.Headers;
+
+namespace HotChocolate.AzureFunctions.IsolatedProcess;
+
+internal sealed class AzureHeaderDictionary : IHeaderDictionary
+{
+ private readonly HttpResponse _response;
+ private readonly HttpResponseData _responseData;
+
+ public AzureHeaderDictionary(HttpResponse response, HttpResponseData responseData)
+ {
+ _response = response;
+ _responseData = responseData;
+ }
+
+ public void Add(KeyValuePair item)
+ {
+ _response.Headers.Add(item.Key, item.Value);
+ _responseData.Headers.Add(item.Key, (IEnumerable)item.Value);
+ }
+
+ public void Clear()
+ {
+ _response.Headers.Clear();
+ _responseData.Headers.Clear();
+ }
+
+ public bool Contains(KeyValuePair item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void CopyTo(KeyValuePair[] array, int arrayIndex)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(KeyValuePair item)
+ {
+ var success = _response.Headers.Remove(item);
+ _responseData.Headers.Remove(item.Key);
+ return success;
+ }
+
+ public int Count => _response.Headers.Count;
+
+ public bool IsReadOnly => _response.Headers.IsReadOnly;
+
+ public void Add(string key, StringValues value)
+ {
+ _response.Headers.Add(key, value);
+ _responseData.Headers.Add(key, (IEnumerable)value);
+ }
+
+ public bool ContainsKey(string key)
+ => _response.Headers.ContainsKey(key);
+
+ public bool Remove(string key)
+ {
+ var success = _response.Headers.Remove(key);
+ _responseData.Headers.Remove(key);
+ return success;
+ }
+
+ public bool TryGetValue(string key, out StringValues value)
+ => _response.Headers.TryGetValue(key, out value);
+
+ public StringValues this[string key]
+ {
+ get => _response.Headers[key];
+ set
+ {
+ _response.Headers[key] = value;
+ _responseData.Headers.Add(key, (IEnumerable)value);
+ }
+ }
+
+ public long? ContentLength
+ {
+ get => _response.Headers.ContentLength;
+ set
+ {
+ _response.Headers.ContentLength = value;
+ _responseData.Headers.Add(
+ HeaderNames.ContentLength,
+ (string?)_response.Headers[HeaderNames.ContentLength]);
+ }
+ }
+
+ public ICollection Keys => _response.Headers.Keys;
+
+ public ICollection Values => _response.Headers.Values;
+
+ public IEnumerator> GetEnumerator()
+ => _response.Headers.GetEnumerator();
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
diff --git a/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpContext.cs b/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpContext.cs
new file mode 100644
index 00000000000..5372c02b82f
--- /dev/null
+++ b/src/HotChocolate/AzureFunctions/src/HotChocolate.AzureFunctions.IsolatedProcess/AzureHttpContext.cs
@@ -0,0 +1,99 @@
+using System.Security.Claims;
+using HotChocolate.AspNetCore;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.Azure.Functions.Worker.Http;
+using Microsoft.Extensions.Primitives;
+using Microsoft.Net.Http.Headers;
+
+namespace HotChocolate.AzureFunctions.IsolatedProcess;
+
+internal sealed class AzureHttpContext : HttpContext
+{
+ private readonly DefaultHttpContext _innerContext;
+ private readonly AzureHttpResponse _innerResponse;
+
+ public AzureHttpContext(HttpRequestData requestData)
+ {
+ if (requestData is null)
+ {
+ throw new ArgumentNullException(nameof(requestData));
+ }
+
+ _innerContext = new DefaultHttpContext();
+ _innerResponse = new AzureHttpResponse(_innerContext.Response, requestData);
+
+ var contentType =
+ requestData.Headers.TryGetValues(HeaderNames.ContentType, out var headerValue)
+ ? headerValue.First()
+ : ContentType.Json;
+
+ _innerContext.User = new ClaimsPrincipal(requestData.Identities);
+
+ var request = _innerContext.Request;
+ request.Method = requestData.Method;
+ request.Scheme = requestData.Url.Scheme;
+ request.Host = new HostString(requestData.Url.Host, requestData.Url.Port);
+ request.Path = new PathString(requestData.Url.AbsolutePath);
+ request.QueryString = new QueryString(requestData.Url.Query);
+ request.Body = requestData.Body;
+ request.ContentType = contentType;
+
+ foreach (var (key, value) in requestData.Headers)
+ {
+ request.Headers.TryAdd(key, new StringValues(value.ToArray()));
+ }
+ }
+
+ public override IFeatureCollection Features => _innerContext.Features;
+
+ public override HttpRequest Request => _innerContext.Request;
+
+ public override HttpResponse Response => _innerResponse;
+
+ public override ConnectionInfo Connection => _innerContext.Connection;
+
+ public override WebSocketManager WebSockets => _innerContext.WebSockets;
+
+ public override ClaimsPrincipal User
+ {
+ get => _innerContext.User;
+ set => _innerContext.User = value;
+ }
+
+ public override IDictionary