我曾经能够使用 v11 Azure SDK API 在 Blob 上创建共享访问签名,如下所示:
var containerName = "mycontainer";
var blobName = "myblob";
CloudStorageAccount storageAccount
= CloudStorageAccount.Parse(<StorageConnectionString>);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(containerName);
SharedAccessBlobPermissions permission = SharedAccessBlobPermissions.Read;
TimeSpan clockSkew = TimeSpan.FromMinutes(15d);
TimeSpan accessDuration = TimeSpan.FromMinutes(15d);
var blobSAS = new SharedAccessBlobPolicy
{
SharedAccessStartTime = DateTime.UtcNow.Subtract(clockSkew),
SharedAccessExpiryTime = DateTime.UtcNow.Add(accessDuration) + clockSkew,
Permissions = permissions
};
CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
string sasBlobToken = blob.GetSharedAccessSignature(blobSAS);
...
Run Code Online (Sandbox Code Playgroud)
我想使用最新的 v12 .NET API,它似乎CloudBlobClient由BlobServiceClient、CloudBlobContainer由BlobContainerClient和CloudBlockBlob …
我在 Xamarin.iOS 应用程序中使用 Entity Framework Core。
在包含在 iOS 应用程序和其他应用程序之间共享的代码 (.netstandard 2.0) 的核心项目中,我想知道是否需要迁移,以便我也可以执行一些其他操作。
这是上下文:
public void Initialize()
{
using (var dbContext = new MyDbContext(m_dbContextOptions))
{
--> bool isNeeded = demoTapeDbContext.Database.IsMigrationNeeded()
demoTapeDbContext.Database.Migrate();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的最接近的是调用该方法GetPendingMigrationsAsync()并检查待处理迁移的数量,但我不确定这是否是在实体框架中进行此类检查的最安全方法:
public async Task InitializeAsync()
{
using (var dbContext = new MyDbContext(m_dbContextOptions))
{
bool isMigrationNeeded = (await demoTapeDbContext.Database.GetPendingMigrationsAsync()).Any();
demoTapeDbContext.Database.Migrate();
}
}
Run Code Online (Sandbox Code Playgroud) 我正在探索运行在 Azure Function 上的内容.net 5,并发现了新的中间件功能。
我构建了一个像这样的虚拟中间件:
public sealed class ExceptionLoggingMiddleware : IFunctionsWorkerMiddleware
{
private readonly ILogger<ExceptionLoggingMiddleware> m_logger;
public ExceptionLoggingMiddleware(ILogger<ExceptionLoggingMiddleware> logger)
{
m_logger = logger;
}
public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
{
try
{
await next(context);
}
catch (Exception unhandledException)
{
m_logger.LogCritical(unhandledException, "Unhandled exception caught: {UnhandledException}", unhandledException.Message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的用例中,Azure 函数是一个 HTTP 触发函数:
public sealed class StorageAccountsFunction
{
private readonly ILogger<StorageAccountsFunction> m_logger;
public StorageAccountsFunction
(
ILogger<StorageAccountsFunction> logger
)
{
m_logger = logger;
}
[Function("v1-post-storage-account")] …Run Code Online (Sandbox Code Playgroud) 我创建了一个新的功能应用程序,为其启用了应用程序服务身份验证/授权(" 使用身份验证/授权来保护您的应用程序并使用每个用户数据 ")并禁用未经身份验证的请求.
到目前为止,一切似乎都正常.如果我尝试请求我的HttpTriggered功能,它需要我先登录; 一旦我登录,所有请求都将按原样处理.所以"保护你的应用程序"部分没有问题.
但是,我完全坚持"使用每用户数据"部分.我的Azure函数被调用为
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
并且没有任何与身份验证相关的内容HttpRequestMessage.(AuthorizationLevel.Anonymous似乎控制着完全不同的东西 - 即,如果该函数可以被任何人调用,或者只能由具有固定API密钥的人调用).
如何获取调用该函数的已认证用户的身份?
c# azure azure-active-directory azure-functions azure-authentication
我正在探索Azure功能.到目前为止我测试的场景效果很好.
我正试图找出一种通过Azure功能上传文件(20MB +)的方法.
我们的想法是,Azure功能将首先验证经过身份验证的用户是否可以在保留请求的流并将其保存到BLOB存储之前上载文件.
这是来自客户端的代码,它创建一个StreamContent将字节发送到服务器的代码:
using (Stream fileStream = ...)
{
var streamContent = new StreamContent(fileStream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentLength = fileStream.Length;
streamContent.Headers.Add("FileId", fileId);
var responseMessage = await m_httpClient.PutAsync(<validURI>, streamContent);
responseMessage.EnsureSuccessStatusCode();
succeeded = true;
}
Run Code Online (Sandbox Code Playgroud)
这是服务器端的代码.
[FunctionName("upload-data")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "put")]HttpRequestMessage req, TraceWriter log)
{
try
{
// Initialize stuff.
// Validate authenticated user & privileges.
// Get the content stream of the request and
// save it in the BLOB storage.
return req.CreateResponse(HttpStatusCode.OK);
} …Run Code Online (Sandbox Code Playgroud) 我正在调查改装库并评估我是否值得集成到我的项目中。
假设我有一个接受POST带有特定合同的消息的控制器:
[Route("api/[controller]")]
[ApiController]
public class KeepAliveController : ControllerBase
{
[HttpPost]
public IActionResult Post(KeepAliveContract keepAliveContract)
{
//
}
}
Run Code Online (Sandbox Code Playgroud)
根据我从refit文档中的理解,我必须创建一个界面。让我们称之为IKeepAliveService。它看起来像这样:
public interface IKeepAliveService
{
[Post("api/keepalive")]
Task SendKeepAliveAsync(KeepAliveContract keepAliveContract);
}
Run Code Online (Sandbox Code Playgroud)
这种做事方式会导致潜在的运行时错误,如果我PostAttribute在签名本身或签名中弄乱了路由。
题
有没有办法从现有控制器中自动生成这个接口,从而降低出现错误的风险?
我正在使用Azure Functionv2。这是我使用构造函数注入的函数:
public sealed class FindAccountFunction
{
private readonly IAccountWorkflow m_accountWorkflow;
private readonly IMapper m_mapper;
private readonly ILogger m_logger;
public FindAccountFunction(ILogger logger, IMapper mapper, IAccountWorkflow accountWorkflow)
{
m_logger = logger;
m_mapper = mapper;
m_accountWorkflow = accountWorkflow;
}
[FunctionName("FindAccount")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger logger)
{
// Do stuff.
}
}
Run Code Online (Sandbox Code Playgroud)
我在派生自IWebJobsStartup以下类的Startup类中声明了要注入到Azure函数中的所有依赖项:
public sealed class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder webJobsBuilder)
{
// Registers the application settings' class. …Run Code Online (Sandbox Code Playgroud) ILogger可以注入到函数参数中,就像Token下面的方法。
但是,将其注入到构造函数参数时发生了以下错误log。
[07/03/2019 17:15:17] 执行“令牌”(失败,Id=4e22b21f-97f0-4ab4-8f51-8651b 09aedc8)[07/03/2019 17:15:17] Microsoft.ExtensionsInject.D抽象:尝试激活“功能”时无法解析“Microsoft.Extensions.Logging.ILogger”类型的服务。
ILogger可以注入Token下面的函数参数。但是当它被注入到构造函数参数时发生了上面的错误log。
public class Functions
{
private HttpClient _httpClient;
private IAppSettings _appSettings;
private ILogger _log;
public Functions(HttpClient httpClient, IAppSettings appSettings //working for these two
, ILogger log //not working, errors
)
{
_log = log;
}
[FunctionName("Token")]
public async Task<IActionResult> Token(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "Token")]
HttpRequest httpRequest,
ILogger log)
{
}
}
Run Code Online (Sandbox Code Playgroud)
下面的依赖注入
[assembly: WebJobsStartup(typeof(Startup))]
namespace MyApp
{
public class Startup : …Run Code Online (Sandbox Code Playgroud) 我正在探索.net5在新的隔离模式下运行的功能应用程序。我有 HTTP 触发的函数,我想通过 OpenAPI / Swagger 进行宣传。
为此,我使用预览版 (0.7.2)Microsoft.Azure.WebJobs.Extensions.OpenApi中的包将 OpenAPI 功能添加到我的 Function App。
我试图让其enums显示string在 OpenAPI 页面中,但我无法让它正常工作。
这是文件中的设置Program.cs:
public static class Program
{
private static Task Main(string[] args)
{
IHost host = new HostBuilder()
.ConfigureAppConfiguration(configurationBuilder =>
{
configurationBuilder.AddCommandLine(args);
})
.ConfigureFunctionsWorkerDefaults(builder =>
{
builder.Services.Configure<JsonSerializerOptions>(options =>
{
options.Converters.Add(new JsonStringEnumConverter());
options.PropertyNameCaseInsensitive = true;
});
})
.ConfigureServices(services =>
{
// Registers any services.
})
.Build();
return host.RunAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
这是枚举:
[JsonConverter(typeof(JsonStringEnumConverter))]
public enum ApprovalContract …Run Code Online (Sandbox Code Playgroud) 我有一个带有以下控制器的ASP.NET Core,该控制器接受POST请求:
[Route("api/v1/tenants/tests")]
public class TestsController : Controller
{
[HttpPost]
public IActionResult Post(string tenantId)
{
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经开发了一种“空”中间件来进行测试。它Configure在Startup.cs文件的方法中定义:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMvc();
app.Use(async (context, next) =>
{
// Forward to the next one.
await next.Invoke();
});
}
Run Code Online (Sandbox Code Playgroud)
题
当我通过Postman调用控制器时,对该POST方法的初始调用成功通过中间件,然后成功到达控制器。但是,以下调用直接转到Controller,完全跳过了中间件。这是为什么?
c# ×10
azure ×6
.net-5 ×2
asp.net-core ×2
azure-sas ×1
ef-core-2.1 ×1
file-upload ×1
middleware ×1
refit ×1
streaming ×1
swagger ×1