c# - 在浏览器上输入 url 时出现设备未就绪错误

标签 c# asp.net-mvc-4

我正在使用 Stripe 支付网关进行电子商务交易。要进行交流,我必须使用 webhook url 意味着我将提供一个 url,以便他们可以与我们交流。 我创建了一个 Controller 和 Action,它是 [AllowAnonymus]。当我在本地运行应用程序并在浏览器上键入 Controller 和操作时,它会触发操作。但是当我部署在我的测试服务器上并执行相同的操作时,它会出现以下错误

Server Error in '/' Application. The device is not ready.

堆栈跟踪:

[IOException: The device is not ready.
]
   System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +14840940
   System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) +1430
   System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost) +211
   System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize, Boolean checkHost) +210
   System.IO.File.InternalWriteAllText(String path, String contents, Encoding encoding, Boolean checkHost) +87
   SchoolManagement.DTO.Entities.OrderItem.SavePartialCharge(String invoiceData) in c:\Atlassian\Bamboo-home\xml-data\build-dir\SMS-PPINBOX-JOB1\SchoolDTO\Entities\OrderItem.cs:185
   SchoolWeb.Controllers.StripeWebhookController.GetStripeResponse() in c:\Atlassian\Bamboo-home\xml-data\build-dir\SMS-PPINBOX-JOB1\SchoolWeb\Controllers\StripeWebhookController.cs:24
   lambda_method(Closure , ControllerBase , Object[] ) +79
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +270
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +120
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +452
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +15
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +33
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +240
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +28
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +53
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +42
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +15
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +288

谁能帮我解决这个问题。

以下代码写在Action中:

public class StripeWebhookController : BaseController
    {
        //
        // GET: /StripeWebhook/

          [AllowAnonymous]
        public JsonResult GetStripeResponse()
        {
            Stream req = Request.InputStream;
            req.Seek(0, System.IO.SeekOrigin.Begin);
            string json = new StreamReader(req).ReadToEnd();
            DTO.OrderItem.SavePartialCharge(json);
            return Json("", JsonRequestBehavior.AllowGet);
        }

    }

添加方法 SavePartialCharge

public static String SavePartialCharge(string invoiceData)
        {
            try
            {

                string stripeEventType = BL.PaymentGateway.StripeReturn.GetStripeType(invoiceData);
                var obj = JObject.Parse(invoiceData);
                var dataObj = obj.SelectToken("data.object");
                var subscriptionID = dataObj.SelectToken("subscription").ToString();
                var customerID = dataObj.SelectToken("customer").ToString();
                var chargeID = dataObj.SelectToken("charge").ToString();
                var amount = Convert.ToDecimal(!dataObj.SelectToken("subtotal").ToString().IsNullOrEmpty() ?dataObj.SelectToken("subtotal").ToString() : "0");

                using (var db = new SchoolEntities())
                {
                    switch (stripeEventType)
                    {

                        case "invoice.payment_failed":
                            var resultorderFailed =
                                db.OrderItems.Where(oi => oi.MerchantServiceSubscriptionID == subscriptionID)
                                    .Select(oi => new {oi.ID, oi.Order.CreditCard4Digits})
                                    .FirstOrDefault();
                            if (resultorderFailed != null)
                                OrderItemInstallment.AddOrderItemInstallment(db, resultorderFailed.ID, amount,
                                    resultorderFailed.CreditCard4Digits, chargeID, false);
                            return "";
                        case "invoice.payment_succeeded":
                            var resultOrderSucceed =
                                db.OrderItems.Where(oi => oi.MerchantServiceSubscriptionID == subscriptionID)
                                    .Select(oi => new {oi.ID, oi.Order.CreditCard4Digits, oi.TotalInstallments})
                                    .FirstOrDefault();
                            if (resultOrderSucceed != null)
                            {
                                OrderItemInstallment.AddOrderItemInstallment(db, resultOrderSucceed.ID, amount,
                                    resultOrderSucceed.CreditCard4Digits, chargeID, true);
                                var count =
                                    db.OrderItemInstallments.Count(
                                        oii => oii.OrderItemID == resultOrderSucceed.ID && oii.Success);
                                if (count == resultOrderSucceed.TotalInstallments)
                                    BL.PaymentGateway.StripePaymentGateway.CancelSubscription(customerID,
                                        subscriptionID);
                            }
                            return "";
                    }
                }

            }
            catch (Exception ex)
            {
                System.IO.File.WriteAllText(@"D:\exception.txt", ex.Message);
            }
            return "";
        }

最佳答案

您的 Stacktrace 指向 StreamWriter 的错误。根据您的代码,StreamWriter 只出现一次:

 catch (Exception ex)
 {
     System.IO.File.WriteAllText(@"D:\exception.txt", ex.Message);
 }

这意味着发生异常,您的 catch block 想要将此异常记录到您的本地驱动器。这会导致另一个异常,因为可能没有驱动器 D。 从逻辑上讲,在您解决了这个异常之后,还会有另一个异常,然后您的 catch block 将正确记录该异常。

检查您的测试机器,是否存在驱动器 D(并且它不是 CD 驱动器)并且您的 IIS 用户帐户具有适当的权限。

旁注:我不会以这种方式捕获异常。这只会用错误消息污染文本文件,没有堆栈跟踪、时间戳等。 您可以利用现有的许多日志记录框架之一(例如 NLOG),让您的生活更轻松。

关于c# - 在浏览器上输入 url 时出现设备未就绪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841504/

相关文章:

c# - C# 中的可空类型是什么?

c# - 在 MongoDB 的组聚合中动态添加匹配运算符

c# - 为什么 Visual Studio 在 Release 构建过程中会在/bin/debug/中寻找未解析的项目引用?

asp.net-mvc-4 - 将参数传递给 Require.js 模块

c# - 使用 Razor 返回数组中的字符串

asp.net-mvc - 在 Razor View 中重命名 mvc 模型对象

c# - Windows 手机 : how get current application id

c# - 我如何将参数添加到 Entity Framework 原始 sql 命令

asp.net-mvc-4 - WebApi放置 "The parameters dictionary contains a null entry for parameter..."

asp.net-mvc - 使用ELMAH的ASP.NET MVC全局错误处理-最佳实践