GraphQL Endpoint不接受多部分表單mimetype,因爲它不是JSON。一旦我通過RootObject和突變中可用的上下文將它們導入到graphql-dotnet中,我就可以使用這些文件。 MVC是什麼讓我失望。
所以我寫了一個簡單的過濾器:
public class RelayResourceFilter : IResourceFilter
{
private readonly string jsonMediaType = "application/json";
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
public void OnResourceExecuting(ResourceExecutingContext context)
{
if (!string.Equals(MediaTypeHeaderValue.Parse(context.HttpContext.Request.ContentType).MediaType,
this.jsonMediaType, StringComparison.OrdinalIgnoreCase))
{
var encoder = JavaScriptEncoder.Create();
var variables = encoder.Encode(context.HttpContext.Request.Form["variables"]);
var query = encoder.Encode(context.HttpContext.Request.Form["query"]);
var body = $"{{\"query\":\"{query}\", \"variables\":\"{variables}\"}}";
byte[] requestData = Encoding.UTF8.GetBytes(body);
context.HttpContext.Request.Body = new MemoryStream(requestData);
context.HttpContext.Request.ContentType = this.jsonMediaType;
}
}
}
註冊吧:
services.AddScoped<RelayResourceFilter>();
,然後應用它像這樣的控制器:
[ServiceFilter(typeof(RelayResourceFilter))]
public async Task<ExecutionResult> Post([FromBody]GraphQLQuery query, bool? useErrorCode)
{
var files = this.Request.HasFormContentType ? this.Request.Form.Files : null;
// ... assignment to Root Object
}
感謝您的答覆喬。我實際上最終爲GraphQL端點寫了一個小的ResourceFilter: –
我如何從他的閱讀中讀取查詢?一般來說,我正在讀這樣的'var request = JsonConvert.DeserializeObject(body);'。然後'request'是包含查詢的對象。如果我上傳的文件內容不是'application/json'。 –
kat1330
@ kat1330我會看看接受的答案。您需要檢查媒體類型。另見https://github.com/graphql-dotnet/relay/blob/master/src/GraphQL.Relay/Http/Deserializer.cs –