【问题标题】:Azure function .net 5 Isolated blob output bindingAzure 函数 .net 5 隔离 blob 输出绑定
【发布时间】:2021-12-09 23:59:54
【问题描述】:

我正在尝试在“测试”容器中创建一个 Blob。在旧版本中,即 Azure 函数 3.1,我使用了 out 参数和 UploadFromStreamAsync() 。但是,在新版本中,没有参数。

我收到错误消息,找不到服务器内部服务器错误 500

有人可以指导我吗?

下面的代码

namespace FunctionBlobOut
{
  public static class Function1
  {

 [Function("BlobOut")]
 [BlobOutput("test")]
 public static async Task<MemoryStream>       
     Run([HttpTrigger(AuthorizationLevel.Function,  "post")] HttpRequestData req,
     FunctionContext executionContext)
 {          
     try
     {
         using (MemoryStream ms = new MemoryStream())
         {
             await req.Body.CopyToAsync(ms);
             return ms;
         }
     }
     catch (System.Exception exp)
     {
         return null;
     }
 }
}

【问题讨论】:

  • 您为我提供了 .NET 3X 中 Azure 功能的解决方案 那是我的旧解决方案。现在,我正在升级到 .NET 5(Azure 功能隔​​离)。所以请阅读问题。

标签: azure-functions


【解决方案1】:

Azure function .net 5 隔离 blob 输出绑定

简单 http 函数的输出绑定类似于旧的类库。您的方法的返回值是 http 响应。 您不能再在函数的参数上指定绑定属性。这是通过函数方法的返回值来完成的

 public static class MultiOutput
    {
        [Function("MultiOutput")]
        public static MyOutputType Run([HttpTrigger(AuthorizationLevel.Anonymous, "get")] HttpRequestData req,
            FunctionContext context)
        {
            var response = req.CreateResponse(HttpStatusCode.OK);
            response.WriteString("Success!");

            string myQueueOutput = "some output";

            return new MyOutputType()
            {
                Name = myQueueOutput,
                HttpResponse = response
            };
        }
    }

    public class MyOutputType
    {
        [QueueOutput("myQueue")]
        public string Name { get; set; }

        public HttpResponseData HttpResponse { get; set; }
    }

更多信息可以参考Output Binding

【讨论】:

  • 您能否举一个类似的 BlobOutput 示例。仅供参考,对于队列,它对我有用。我需要创建 Blob。
【解决方案2】:

应该是这样的。 我没有对此进行测试,但根据我周围的一些代码对其进行了修改。

namespace FunctionBlobOut
{
  public static class Function1
  {
    [Function("BlobOut")]
    public static async Task<MyOutputType> Run([HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
      var result = new MyOutputType();

      using (MemoryStream ms = new MemoryStream())
      {
        await req.Body.CopyToAsync(ms);
        result = new MyOutputType { Blob = ms.GetBuffer() };
      }

      result.HttpResponse = req.CreateResponse(HttpStatusCode.NoContent);

      return result;
    }
  }

  public class MyOutputType
  {
    [BlobOutput("container/filename", Connection = "BlobStorage")]
    public byte[]? Blob { get; set; }

    public HttpResponseData HttpResponse { get; set; }
  }
}

一些值得指出的地方:

  • 在隔离模式下,您没有其他方式拥有的精美绑定。这意味着您需要使用基本类型,例如 byte[] 和 string。 Stream、Blob、BlobClient 等将不起作用。
  • 由于您正在接收 HTTP 请求,因此除了您的 blob 之外,您还应该返回一个 HTTP 响应。
  • 如果在某些情况下您不想生成 blob,只需将 MyOutputType.Blob 设置为 null。这是可以为空的事实将避免创建一个空的 blob。我不确定如果你传递一个空字节[]会发生什么。

就个人而言,在这种情况下,我只会返回一个 HTTP 响应并使用 Azure.Storage.Blobs 库(BlobClient 等)处理 blob,而不使用任何形式的输出绑定。与较短的代码相比,我更喜欢拥有更多的功能和灵活性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多