我在部署应用程序方面没有太多经验。
我有一个ASP.Net应用程序,我通过HTTPS向第三方Web服务执行调用。 webservice返回一个xml字符串,然后我在我这边解析。在我的开发环境中,这非常有效。但是,当我部署应用程序(到生产VM)时,webservice莫名其妙地不会返回任何内容,我的解析步骤会抛出一个空引用异常。
有关生产环境的更多信息:
服务调用似乎无声地失败,因为事件日志仅列出空引用异常,没有特别与服务调用有关。
我错过了什么?
public void RunEnquiry(Client Client, string ResultType = "XPDF")
{
NormalSearch_Live_Service.NormalSearchServiceClient csClient = new NormalSearch_Live_Service.NormalSearchServiceClient();
using (var db = new CreditBureauxDbContext())
{
// --== Step 1: Create the enquiry data-entities ==--
var eb = new EnquiryBlock
{
CS_Data = "Y",
CPA_Plus_NLR_Data = "N",
Deeds_Data = "N",
Directors_Data = "N",
Identity_number = Client.Person.IDNumber.Truncate(13),
Surname = Client.Person.Surname.Truncate(25),
Forename = Client.Person.FullNames.Trim().Split(' ').Count() > 0 ? Client.Person.FullNames.Trim().Split(' ')[0].Truncate(15) : "",
Forename2 = Client.Person.FullNames.Trim().Split(' ').Count() > 1 ? Client.Person.FullNames.Trim().Split(' ')[1].Truncate(15) : "",
Forename3 = Client.Person.FullNames.Trim().Split(' ').Count() > 2 ? Client.Person.FullNames.Trim().Split(' ')[2].Truncate(15) : "",
Gender = Client.Person.Gender.Truncate(1),
Passport_flag = "N",
DateOfBirth = DateTime.Parse(Client.Person.DateOfBirthUTC).ToString("yyyyMMdd"),
Address1 = "",
Address2 = "",
Address3 = "",
Address4 = "",
PostalCode = "",
HomeTelCode = "",
HomeTelNo = "",
WorkTelCode = "",
WorkTelNo = "",
CellTelNo = "",
ResultType = ResultType,
RunCodix = "N",
Adrs_Mandatory = "N",
Enq_Purpose = db.EnquiryPurposes.FirstOrDefault(ep => ep.Description.ToUpper().Contains("CREDIT ASSESSMENT")).Value,
Run_CompuScore = "N",
ClientConsent = "Y"
};
var enq = new Enquiry
{
pInput_Format = "XML",
pOrigin = "CrediScan",
pOrigin_Version = "1.0",
pVersion = "1.0",
Parameters = eb,
RequestSent_TimestampUTC = DateTime.UtcNow.ToString()
};
using (var settings = new GlobalConfigDbContext())
{
// --== Step 2: Construct & perform service call ==--
var param = new NormalSearch_Live_Service.NormalEnqRequestParamsType
{
pInput_Format = "XML",
pOrigin = "CrediScan",
pOrigin_Version = "1.0",
pUsrnme = settings.GetSettingValueAsString("Credit Check: PROD Username"),
pPasswrd = settings.GetSettingValueAsString("Credit Check: PROD Password"),
pVersion = "1.0",
pTransaction = String.Format("<Transactions>{0}</Transactions>", eb.ToXML())
};
var result = csClient.DoNormalEnquiry(param);
// --== Step 3: Create enquiry result data-entities ==--
var er = new EnquiryResult
{
ErrorCode = result.errorCode,
ErrorString = result.errorString,
TransactionCompleted = result.transactionCompleted,
RetData = result.retData
};
enq.EnquiryResult = er;
Trace.TraceInformation("RETDATA" + Environment.NewLine + result.retData);
var retDataDecoded = result.retData.DecodeBase64ToByteArray();
if (!Encoding.UTF8.GetString(retDataDecoded, 0, 2).Equals("PK") || retDataDecoded.Length <= 5)
throw new FormatException("The data returned from CreditBureaux is not in the correct format or contains an error.");
// --== Step 4: Save the query and validated results to database ==--
try
{
db.Enquiries.Add(enq);
db.SaveChanges();
}
catch (DbEntityValidationException dbe)
{
Trace.TraceError(dbe.ToString());
throw;
}
// --== Step 5: Parse the results ==--
if (ResultType.Equals("XML"))
{
if (!Encoding.UTF8.GetString(retDataDecoded, 0, 2).Equals("PK") || retDataDecoded.Length <= 5)
throw new FormatException("The data returned from CreditBureaux is not in the correct format or contains an error.");
Trace.TraceInformation("\n\n\n" + retDataDecoded.UnZipToMemoryList()[0].ReadToString() + "\n\n\n");
}
if (ResultType.Equals("XPDF"))
{
Trace.TraceInformation("UNZIPPING PDF");
Trace.TraceInformation("RETDATA" + Environment.NewLine + result.retData);
var xmlDoc = XDocument.Parse("<?xml version=\"1.0\"?>" + retDataDecoded.UnZipToMemoryList()[0].ReadToString()); //Important!
var summaryItems = xmlDoc
.Root
.Element("EnqCC_ENQ_COUNTS")
.Element("ROW")
.Elements()
.Select(dn => new EnquirySummaryItem
{
Key = dn.Name.ToString(),
Value = dn.Value
})
.ToList();
var summary = new EnquirySummary
{
Enquiry_Id = xmlDoc.Root.Element("Enquiry_ID").Value,
EnquiryDate = xmlDoc.Root.Element("EnqCC_SRCHCRITERIA").Descendants("ENQ_DATE").ElementAt(0).Value,
EnquiryResult = enq.EnquiryResult,
SummaryItems = summaryItems
};
try
{
db.EnquirySummaries.Add(summary);
db.SaveChanges();
}
catch (DbEntityValidationException dbe)
{
Trace.TraceError(dbe.ToString());
throw;
}
var directory = settings.GetSettingValueAsString("Document Management: Client Documents Root Path").TrimEnd('\\') + "\\CreditBureaux\\" ;
var fileName = summary.Enquiry_Id + ".pdf";
FileHandlingFactory.Create().SaveFile(xmlDoc.Root.Element("CC_PDF_RESULTS").Value.DecodeBase64ToByteArray().ToMemoryStream(), directory, fileName);
docMan.Add_Document(
new FileItem {
CreatedOn_TimeStampUTC = DateTime.UtcNow,
FilePathOnServer = directory,
PrivateFileName = fileName,
PublicFileName = (Client.Person.Surname + Client.Person.NickName[0]) + "_" + fileName,
MimeType = "application/pdf"
},
docMan.FindOrCreate_ContextInstance(
docMan.Get_ContextClass("Client"),
new Dictionary<string, string>(){
{"ClientId",Client.Id.ToString()}
}),
new List<DocumentClass> { docMan.Get_DocumentClass("CreditBureaux enquiry") });
//xmlDoc.Root.Element("CC_PDF_RESULTS").Value
//.DecodeBase64ToByteArray()
//.SaveToFile(directory, summary.Enquiry_Id + ".pdf");
}
}
}
}
要跟随的堆栈跟踪:
>应用程序中的服务器错误。值不能为空。参数名称:s
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.ArgumentNullException:值不能为null。 参数名称:s
来源错误:
执行期间生成了未处理的异常 当前的网络请求。有关的来源和位置的信息 可以使用下面的异常堆栈跟踪来识别异常。
堆栈追踪:
[ArgumentNullException:Value不能为null。参数名称:s]
System.Convert.FromBase64String(String s)+14073970
SomeCompany.CreditBureaux.BLL.CreditBureauxLiveClient.RunEnquiry(客户端 Client,String ResultType)+2270
SomeCompany.CrediScan.UI.Views.ClientController.CreditCheck(Int64 id) +264 lambda_method(Closure,ControllerBase,Object [])+114 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters) +242
2 参数)+39
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult的 asyncResult,ActionInvocation innerInvokeState)+12
System.Web.Mvc.Async.WrappedAsyncResult2.CallEndDelegate(IAsyncResult asyncResult) +139
1.CallEndDelegate(IAsyncResult的 asyncResult)+111
System.Web.Mvc.Async.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d() +112 System.Web.Mvc.Async.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f() +452 System.Web.Mvc.Async.<>c__DisplayClass33.<BeginInvokeActionMethodWithFilters>b__32(IAsyncResult asyncResult) +15
System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +37 System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +241
System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +29
System.Web.Mvc.Async.WrappedAsyncVoid
System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult)+53 System.Web.Mvc.Async.WrappedAsyncVoid1.CallEndDelegate(IAsyncResult asyncResult) +19
1.CallEndDelegate(IAsyncResult的 asyncResult)+111
System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +51
System.Web.Mvc.Async.WrappedAsyncVoid
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +606 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&amp; completedSynchronously)+288