Parsing AWS SNS notification in .net core 1.0

匿名 (未验证) 提交于 2019-12-03 01:05:01

问题:

I have a VisualStudio17 serverless application project and am using .net core Web Api.

I want to confirm my SNS subscription, but I have a problem that AWS sends the POST request with header content-type set to text/plain; charset=UTF-8 while body is JSON.

Here's an example request from their documentation:

POST / HTTP/1.1 x-amz-sns-message-type: Notification x-amz-sns-message-id: da41e39f-ea4d-435a-b922-c6aae3915ebe x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55 Content-Length: 761 Content-Type: text/plain; charset=UTF-8 Host: ec2-50-17-44-49.compute-1.amazonaws.com Connection: Keep-Alive User-Agent: Amazon Simple Notification Service Agent  {   "Type" : "Notification",   "MessageId" : "da41e39f-ea4d-435a-b922-c6aae3915ebe",   "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",   "Subject" : "test",   "Message" : "test message",   "Timestamp" : "2012-04-25T21:49:25.719Z",   "SignatureVersion" : "1",   "Signature" : "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=",   "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",   "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55" } 

Content-type: text, body JSON. This makes it parsing quite difficult, and a simple

public void Post([FromBody] string t) // or dynamic t for the matter

doesn't work and throws the Request was short circuited at action filter 'Microsoft.AspNetCore.Mvc.ModelBinding.UnsupportedContentTypeFilter'. exception.

Am I missing something? Why are they doing this and how do I work with this?

回答1:

I made it work like I described in this answer, by adding text/plain to formats that JsonInputFormatter should format.

public void ConfigureServices(IServiceCollection services) {     services.AddMvc(config =>     {         foreach (var formatter in config.InputFormatters)         {             if (formatter.GetType() == typeof(JsonInputFormatter))                  ((JsonInputFormatter)formatter).SupportedMediaTypes.Add(                       MediaTypeHeaderValue.Parse("text/plain"));         }      });      ... }


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!