我使用Stripe支付网关进行电子商务交易。为了进行交流,我必须使用web钩子网址,这意味着我将提供一个url,以便他们可以与我们通信。我创建了一个控制器和动作,它是[AllowAnonymus]。当我在本地运行应用程序并在浏览器上键入控制器和操作时,它就会命中该操作。但是,当我在测试服务器上部署并执行同样的操作时,会出现以下错误
'/‘应用程序中的服务器错误。设备还没准备好。
堆栈跟踪:
[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有人能帮我解决这个问题吗。
在“行动”中编写的下列代码:
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 "";
}发布于 2015-06-15 09:53:27
您的Stacktrace指向一个StreamWriter错误。根据您的代码,只有一次出现了StreamWriter:
catch (Exception ex)
{
System.IO.File.WriteAllText(@"D:\exception.txt", ex.Message);
}这意味着,会发生异常,而catch块希望将此异常记录到本地驱动器。这会导致另一个异常,因为逻辑上可能没有驱动器D,在您解决了此异常之后,将出现另一个异常,然后您的catch块将正确地记录该异常。
检查您的测试机器,如果存在驱动器D(并且它不是cd驱动器),并且IIS用户帐户具有适当的权限。
旁白:这样我就不会破例了。这只会污染带有错误消息的文本文件,而没有堆栈跟踪、时间戳等。您可以打开已经存在的众多日志框架之一(例如,NLOG),并使您的生活更加轻松。
发布于 2015-06-15 10:23:06
“设备还没有准备好”的错误似乎来自Win32 (按照http://referencesource.microsoft.com/#mscorlib/system/io/file.cs,56cd161c65ab07fe,references )。如果它在确保给定权限之后仍然存在,并且存在这样的驱动器,则可能是一些硬件问题。在这种情况下,您可以在https://superuser.com/questions/364851/how-to-troubleshoot-the-device-is-not-ready-error-in-windows-xp的希望,它有帮助!
PS。是的,将日志(nlog、log4net或手动保存到App_data文件夹)并不是很好的方法。
发布于 2022-03-28 14:02:19
在我的情况下,当我从.net代码将无效的参数名传递给存储过程时,会发生此问题。
在我的存储过程中,我将输入参数声明为'caseId‘,但是在代码中,我用输入参数调用存储过程为'case_Id’(带有下划线)。
https://stackoverflow.com/questions/30841504
复制相似问题