无法从ASP.Net WebAPI 2将数据发布到SQS中

时间:2015-01-02 13:35:28

标签: c# asp.net amazon-web-services asp.net-web-api

我正在尝试从ASP.Net webapi应用程序向AWS SQS队列发布一些数据。 我正在使用AmazonSQSClient SendMessage()来执行此操作。

它在控制台应用程序和Windows服务中运行良好。但是,当我从webapi应用程序尝试相同的事情时,SendMessage()方法会引发以下异常:

[Amazon.Runtime.AmazonServiceException]
{"遇到WebException(ConnectFailure),请求无法重试。已超过最大重试次数(4/4)或请求使用不可搜索的流。"}

内部异常
{"发送请求时出错。"},{"无法连接到远程服务器"}

堆栈跟踪:

    at Amazon.Runtime.AmazonWebServiceClient.RetryOrThrow(WebRequestState state, Exception exception) at Amazon.Runtime.AmazonWebServiceClient.
<InvokeConfiguredRequest>d__3`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
  task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at Amazon.Runtime.AmazonWebServiceClient.
  <InvokeConfiguredRequest>d__3`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
    task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at Amazon.Runtime.AmazonWebServiceClient.
    <InvokeConfiguredRequest>d__3`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
      task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at Amazon.Runtime.AmazonWebServiceClient.
      <InvokeConfiguredRequest>d__3`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task
        task) at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() at Amazon.Runtime.AmazonWebServiceClient.
        <InvokeConfiguredRequest>d__3`1.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Amazon.SQS.AmazonSQSClient.SendMessage(SendMessageRequest request) at WebAPI.Alerts.Controllers.AlertsController.SendMessage(Queue
          queue, QueueRequest request) in c:\....\Controllers\AlertsController.cs:line 418

有人可以帮助我吗?

添加一些代码以更好地解释问题:

  private QueueResponse SendMessage(Queue queue, QueueRequest request)
    {
        var queueResponse = new QueueResponse();
        try
        {
            if (queue != null)
            {
                if (request != null)
                {
                    using (this._queueServiceClient = this.CreateQueueServiceClient(queue.AccessKeyId, queue.SecretAccessKey))
                    {
                        var request1 = new SendMessageRequest()
                        {
                            DelaySeconds = request.DelaySeconds,
                            MessageBody = request.MessageBody,
                            QueueUrl = queue.Url
                        };
                        if (request.Attributes != null && request.Attributes.Count > 0)
                            request1.MessageAttributes = Enumerable.ToDictionary<MessageAttribute, string, MessageAttributeValue>((IEnumerable<MessageAttribute>)request.Attributes, (Func<MessageAttribute, string>)(a => a.Name), (Func<MessageAttribute, MessageAttributeValue>)(b => new MessageAttributeValue()
                            {
                                DataType = b.DataType,
                                StringValue = b.Value
                            }));
                        SendMessageResponse sendMessageResponse = this._queueServiceClient.SendMessage(request1);
                        if (sendMessageResponse == null)
                            throw new Exception("No response from the Queue");
                        queueResponse.ResponseCode = ((object)sendMessageResponse.HttpStatusCode).ToString();
                    }
                }
            }
        }
        catch (Exception ex)
        {
            queueResponse.ResponseCode = ((object)HttpStatusCode.BadRequest).ToString();
            queueResponse.ErrorMessage = ex.Message;
        }
        return queueResponse;
    }

更新 该问题似乎与代理设置有关。如果系统中已打开fiddler,则webapi会成功访问该队列。但如果提琴手关闭,它就会失败。

最终更新

毕竟这个问题有点傻。 Webapi需要使用系统代理。 添加

<system.net>
    <defaultProxy enabled="true"></defaultProxy>
  </system.net>

在机器配置中解决了这个问题。

1 个答案:

答案 0 :(得分:1)

我只是将解决方案作为答案重新发布,以便我可以将问题标记为已解决。

Webapi需要在发布请求时使用系统代理。添加

<system.net>
    <defaultProxy enabled="true"></defaultProxy>
  </system.net>
机器配置中的

解决了这个问题。