2016-11-11 32 views

回答

3

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 
} 
2

您是否在計算如何訪問服務器上解析器中的文件時遇到困難?您可以將文件作爲您的rootObjectuserContext傳遞。

// GraphQLController 
var files = Request.Form.Files; 
var userContext = files; 

var result = await executer.ExecuteAsync(
    schema, 
    rootObject, 
    query, 
    operationName, 
    inputs, 
    userContext).ConfigureAwait(false); 

// Mutation type 
Field<StringGraphType>(
    "uploadFile", 
    arguments: new QueryArguments(new QueryArgument<NonNullGraphType<StringGraphType>> {Name = "fileName"}), 
    resolve: context => 
    { 
     var userContext = context.UserContext.As<IFormFileCollection>(); 

     // process files 

     // return data 
     return "success"; 
    }); 
+1

感謝您的答覆喬。我實際上最終爲GraphQL端點寫了一個小的ResourceFilter: –

+0

我如何從他的閱讀中讀取查詢?一般來說,我正在讀這樣的'var request = JsonConvert.DeserializeObject (body);'。然後'request'是包含查詢的對象。如果我上傳的文件內容不是'application/json'。 – kat1330

+0

@ kat1330我會看看接受的答案。您需要檢查媒體類型。另見https://github.com/graphql-dotnet/relay/blob/master/src/GraphQL.Relay/Http/Deserializer.cs –