【问题标题】:Angular $http POST to remote GoDaddy windows server returns 500 Internal Server errorAngular $http POST 到远程 GoDaddy Windows 服务器返回 500 内部服务器错误
【发布时间】:2015-05-25 13:51:54
【问题描述】:

我有用于发送电子邮件的简单用户表单。当用户提交表单时,其数据将传递给处理服务器端电子邮件处理的 web 方法(称为“SendParameters”)。

下面的代码在本地可以正常工作,但是当我将它部署到我的远程主机时,我得到http://simoneduca.com/Default.aspx/SendParameters 500 Internal Server Error

这是我在app.js的电话

var myApp = angular.module('MyApp', ['ngMessages', 'ngAnimate']);  
myApp.controller('FormCtrl', function ($scope, $http, $timeout) {      
    $scope.master = {};    
    $scope.reset = function () {
        $scope.user.name = "";
        $scope.user.emailAddress = "";
        $scope.user.subject = "";
        $scope.user.message = "";
        $scope.contactForm.$setPristine();
        $scope.contactForm.$setUntouched();
    };
    $scope.submit = function (user) {
        $scope.master = angular.copy(user);
        $http({
            method: "POST",
            url: "Default.aspx/SendParameters",
            headers: { 'Content-Type': 'application/json; charset=utf-8' },
            data: JSON.stringify($scope.master)
        }).success(function (data, status, header) {
            $scope.resultMessage = data.d;
            $scope.showMessage = true;
            $timeout(function () {
                $timeout(function () {
                    $scope.showMessage = false;
                }, 2000);
            }, 3000);
            console.log('data.d: ', data.d)
            console.log('status: ', status)
            console.log('headers: ', header)
            console.log('data: ', data)
            $scope.reset();
        });  
    };
});

这是我在index.html中的html表单

<!DOCTYPE html>
<html ng-app="MyApp">

<head>
  <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" />
  <script src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
  <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>   
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-messages.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.15/angular-animate.min.js"></script>
  <script src="app.js"></script>
</head>

<body>
  <h1>FORM</h1>
  <div class="cform" id="contact-form">
    <form role="form" id="contactForm" ng-controller="FormCtrl" name="contactForm" novalidate>

      <div class="form-group" ng-class="{'has-error': contactForm.name.$invalid && contactForm.name.$dirty}">
        <label for="name">Your Name</label>
        <input type="text" runat="server" name="name" class="form-control" id="name" placeholder="Your Name" ng-model="user.name" ng-minlength="3" ng-maxlength="30" required />
        <div ng-messages="contactForm.name.$error" class="error" ng-if="contactForm.name.$dirty" ng-messages-include="error-messages.html">
        </div>
      </div>
      <div class="form-group" ng-class="{'has-error': contactForm.emailAddress.$invalid && contactForm.emailAddress.$dirty}">
        <label for="emailAddress">Your Email</label>
        <input type="email" id="email" placeholder="Your Email" class="form-control" name="emailAddress" ng-model="user.emailAddress" ng-minlength="5" ng-maxlength="30" required />
        <div ng-messages="contactForm.emailAddress.$error" class="error" ng-if="contactForm.emailAddress.$dirty" ng-messages-include="error-messages.html">
        </div>
      </div>
      <div class="form-group" ng-class="{'has-error': contactForm.subject.$invalid && contactForm.subject.$dirty}">
        <label for="subject">Subject</label>
        <input type="text" ng-model="user.subject" class="form-control" name="subject" id="subject" placeholder="Subject" required />
        <div ng-messages="contactForm.subject.$error" class="error" ng-if="contactForm.subject.$dirty" ng-messages-include="error-messages.html">
        </div>
      </div>
      <div class="form-group" ng-class="{'has-error': contactForm.message.$invalid && contactForm.message.$dirty}">
        <label for="message">Describe your project</label>
        <textarea class="form-control" ng-model="user.message" id="message" name="message" rows="5" required></textarea>
        <div ng-messages="contactForm.message.$error" class="error" ng-if="contactForm.message.$dirty" ng-messages-include="error-messages.html">
        </div>
      </div>
      <button id="sendEmail" runat="server" ng-click="submit(user)" type="submit" ng-disabled="contactForm.$invalid" class="btn btn-theme pull-right">SEND</button>

      <button type="button" ng-click="reset()" class="btn">Reset</button>
      <div ng-show="showMessage" class="feedback">{{ resultMessage }}</div>

    </form>
  </div>
</body>

</html>

这是我在 Default.aspx.cs 中的 web 方法

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using System.Net.Mail;
using System.Web.Services;


namespace SimoWebTest1
{
    public partial class singlePage : System.Web.UI.Page
    {

        [WebMethod]
        public static string SendParameters(string name, string emailAddress, string subject, string message)
        {
            if (string.IsNullOrEmpty(emailAddress) || string.IsNullOrEmpty(subject) || string.IsNullOrEmpty(message))
            {
                return string.Format("Please complete the form.");
            }
            else
            {
                try
                {
                    SmtpClient client = new SmtpClient();
                    client.Port = 80;
                    client.Host = "smtpout.europe.secureserver.net";

                    client.EnableSsl = false;
                    client.Timeout = 10000;
                    client.DeliveryMethod = SmtpDeliveryMethod.Network;
                    client.UseDefaultCredentials = false;
                    client.Credentials = new System.Net.NetworkCredential("iam@simoneduca.com", "password");
                    MailMessage mm = new MailMessage(emailAddress, "iam@simoneduca.com", subject, message);
                    mm.BodyEncoding = System.Text.UTF8Encoding.UTF8;
                    mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
                    client.Send(mm);
                    return string.Format("Your message has been sent. Thank you {0}!", name);
                }
                catch (Exception)
                {
                    //return string.Format("Inner Exception: {0}.<br/>Message: {1} ", ex.InnerException, ex.Message);
                    return string.Format("Oops, your message could not be sent. Please retry.");
                }
            }

        }
    }
}

我已尝试将application/json; charset=utf-8 更改为application/x-www-form-urlencoded; charset=utf-8

data: JSON.stringify($scope.master)data: $.param($scope.master)

这似乎改善了这种情况:返回了status 200,但正如预期的那样,返回的是整个html页面而不是JSON字符串。

有人知道为什么吗?

我还尝试在我的提交函数中使用 Angular 快捷方式并发送到change the format of how the data is passed to url parameters

var transform = function (user) {
    $scope.master = angular.copy(user);
    return $.param($scope.master);
}
$scope.submit = function (user) {
        $scope.master = angular.copy(user);
        $http.post("Default.aspx/SendParameters", $scope.master, {
            headers: { 'Content-Type': 'application/json; charset=UTF-8' },
            transformRequest: transform
        }).success(function (data, status, header) {
            $scope.resultMessage = data.d;
                    $scope.showMessage = true;
                    $timeout(function () {
                        $timeout(function () {
                            $scope.showMessage = false;
                        }, 2000);
                    }, 3000);
                    console.log('data.d: ', data.d)
                    console.log('status: ', status)
                    console.log('headers: ', header)
                    console.log('data: ', data)
                    $scope.reset();
        });
    };

最后但同样重要的是,我还打电话给 Godaddy(我的托管服务提供商)询问他们是否支持 Json 扩展,他们说不支持。

可能是这个问题吗?有没有办法绕过它?

我认为a Plunker 会有所帮助,但呼叫失败:400 Bad Request

【问题讨论】:

  • 您可以控制服务器端代码吗?如果是这样,请尝试将 Elmah 之类的内容添加到您的 .NET 站点中,看看实际错误是什么。
  • @SergeyAkopov 欢呼,我会试试的。

标签: c# asp.net json angularjs http-post


【解决方案1】:

我遇到了类似的问题。我最终不得不进入托管选项、ASP.Net 设置,并且在底部有一个 CAS 信任级别选项。默认情况下,它设置为 Mid,我不得不将其设置为满。一旦我这样做了,它工作得非常好。

网站和域>>(查找您正在处理的域)>> 显示更多(面板底部的选项卡)>> ASP.Net 设置

我希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多