c# - 如何在没有url编码的情况下允许&在带有西类牙字符的url中的单词之间

标签 c# asp.net .net asp.net-mvc

我花了很多时间来解决问题。我正在调用第 3 方 API,例如

http://abc/app.aspx?deFleetLastName=MyName&Test123&deFleetFirstName=ààÃÅjeetaSisodiààÃÅ

在上面的 url 中,我想允许 & 在像 MyName&Test123 这样的词之间。 我还想允许像 ààãÅjeetaSisodiààãÅ 这样的西类牙字符

我正在使用下面的代码来允许使用西类牙文字符并且它可以正常工作。

AuthRequest = "&deTCIVRAccountNumber=" + SecCardReq.AdminNumber;
                AuthRequest += "&deCISSTitle=" + SecCardReq.Title;
                AuthRequest += "&deTCIVRCardHolderIdentFirstName=" + SecCardReq.FirstName;
                AuthRequest += "&deTCIVRCardHolderIdentMiddleName=" + SecCardReq.MiddleName;
                AuthRequest += "&deTCIVRCardHolderIdentLastName=" + SecCardReq.LastName;
                AuthRequest += "&deCISSSecLastName=" + SecCardReq.SecLastName;
                AuthRequest += "&deCISSNameOnCard=" + SecCardReq.NameOnCard;
                AuthRequest += "&deTCIVRCardHolderIdentAddressLine1=" + SecCardReq.AddressLine1;
                AuthRequest += "&deTCIVRCardHolderIdentAddressLine2=" + SecCardReq.AddressLine2;
                AuthRequest += "&deTCIVRCardRegistrationCity=" + SecCardReq.City;
                AuthRequest += "&deTCIVRCardHolderIdentificationStateProvince=" + SecCardReq.State;
                AuthRequest += "&deTCIVRCardRegistrationPostalCode=" + SecCardReq.PostalCode;
                AuthRequest += "&deTCIVRCardRegistrationCountry=" + SecCardReq.Country;
                AuthRequest += "&deTCIVRCardRegistrationEmail=" + SecCardReq.Email;
                AuthRequest += "&deCISSEmail2=" + SecCardReq.Email2;
                AuthRequest += "&deTCIVRCardHolderIdentDOB=" + SecCardReq.DOB;
                AuthRequest += "&deCISSMotherMaidenName=" + SecCardReq.MotherMaidenName;
                AuthRequest += "&deTCIVRCardHolderIdentificationIdCode=" + SecCardReq.IdType;
                AuthRequest += "&deCIAOtherIDDescription=" + SecCardReq.IDDescription;
                AuthRequest += "&deTCIVRCardHolderIdentificationIdNumber=" + SecCardReq.IdNumber;
                AuthRequest += "&deCIAIDIssueDate=" + Convert.ToString(SecCardReq.IDIssueDate);
                AuthRequest += "&deCIAIDExpirationDate=" + Convert.ToString(SecCardReq.IDExpirationDate);

                AuthRequest += "&deCIASIssuedBy=" + SecCardReq.IDIssuedBy;
                AuthRequest += "&deCIAIDIssueState=" + SecCardReq.IDIssueState;
                AuthRequest += "&deSecondaryCardTypeForAPI=" + SecCardReq.SecondaryCardTypeForAPI;
                AuthRequest += "&deCIASHomePhoneCCode=" + SecCardReq.HomePhoneCountryCode;
                AuthRequest += "&deTCIVRCardRegistrationPhone=" + SecCardReq.HomePhoneNumber;
                AuthRequest += "&deCIASOfficePhoneCCode=" + SecCardReq.WorkPhoneCountryCode;
                AuthRequest += "&deCISSWorkPhoneNumber=" + SecCardReq.WorkPhoneNumber;
                AuthRequest += "&deCIASOfficePhoneExt=" + SecCardReq.WorkPhoneExt;
                AuthRequest += "&deMobilePhCCode=" + SecCardReq.MobilePhoneNumberCCode;
                AuthRequest += "&deCISSMobilePhoneNumber=" + SecCardReq.MobilePhoneNumber;
                AuthRequest += "&deFaxNumberCCode=" + SecCardReq.HomeFaxNumberCCode;
                AuthRequest += "&deCISSHomeFaxNumber=" + SecCardReq.HomeFaxNumber;
                AuthRequest += "&deWorkFaxNumberCCode=" + SecCardReq.WorkFaxNumberCCode;
                AuthRequest += "&deCISSWorkFaxNumber=" + SecCardReq.WorkFaxNumber;
                AuthRequest += "&deCISSLanguageIndicator=" + SecCardReq.LanguageIndicator;
                AuthRequest += "&deSecondaryCardPinAPI=" + SecCardReq.SecondaryCardPin;
                AuthRequest += "&deSecondaryCardDealerNumberForAPI=" + SecCardReq.SecondaryCardDealerNumber;
                AuthRequest += "&deIVREmbossingHotStamp=" + SecCardReq.EmbossingHotStamp;
                AuthRequest += "&deSecondaryCardPrivacy=" + SecCardReq.SecondaryCardPrivacy;
                AuthRequest += "&dePPCIPNumber=" + SecCardReq.PPCIPNumber;
                AuthRequest += "&deIVREmbossingLine4=" + SecCardReq.EmbossingLine4;
                AuthRequest += "&dePPCIPType=" + SecCardReq.PPCIPType;
                AuthRequest += "&dePDDeliveryMechanism=" + SecCardReq.DeliveryMechanism;
                AuthRequest += "&dePPCIPStatus=" + SecCardReq.PPCIPStatus;
                AuthRequest += "&deSecondaryCardExpOptForAPI=" + (SecCardReq.SecondaryCardExpOpt != null ? SecCardReq.SecondaryCardExpOpt : "");
                AuthRequest += "&deSecondaryVCExpAfrTxnEntryAPI=" + SecCardReq.SecondaryVCExpAfrTxnEntry ?? "";
                AuthRequest += "&deSecondaryVCExprAfrDaysEntryAPI=" + SecCardReq.SecondaryVCExprAfrDaysEntry ?? "";
                AuthRequest += "&deSecondaryVCExprAfrDaysEntryDuration=" + SecCardReq.SecondaryVCExprAfrDaysEntryDuration ?? "";
                AuthRequest += "&deSecondaryVCExpOnDate=" + (SecCardReq.SecondaryVCExpOnDate != null ? SecCardReq.SecondaryVCExpOnDate : "");
                AuthRequest += "&deSecondaryVirtualCardLimit=" + SecCardReq.SecondaryVirtualCardLimit;
                AuthRequest += "&deSecondaryVirtualCardResetAllowedForAPI=" + "0"; // As per new changes in SCP
                AuthRequest += "&deCardValidFromDateAPI=" + SecCardReq.StartDate; // As per new changes in SCP
                AuthRequest += "&deCardValidTillDateAPI=" + SecCardReq.StopDate; // As per new changes in SCP
                AuthRequest += "&deBookingRefNumber=" + SecCardReq.BookingRefNumber; // As per new changes in SCP
                AuthRequest += "&dePPSSN=" + SecCardReq.DecryptedSSN;
                AuthRequest += "&deIVRSource=" + PortalCommon.PlateFormName;
                AuthRequest += "&deMakerCheckerJobID=" + SecCardReq.jobID;
                AuthRequest += "&deMakerCheckerFlag=" + SecCardReq.makerCheckerFlag;

                AuthRequest += "&deExistingCustomerId=" + SecCardReq.CustomerId;
                AuthRequest += "&deBankingCustomerIdAPI=" + SecCardReq.BankingCustomerId;

                //IDS CIBANCO CHANGES
                AuthRequest += "&dePoBCountry=" + SecCardReq.POBCountry;
                AuthRequest += "&dePoBState=" + SecCardReq.POBStateProvince;
                AuthRequest += "&dePoBCity=" + SecCardReq.POBCity;
                AuthRequest += "&deNationality=" + SecCardReq.Nationality;
                AuthRequest += "&deSACCode=" + SecCardReq.SACActivationCode;
                AuthRequest += "&deCHCustomerIdDetailMsg=" + SecCardReq.IDDetails;

                HttpRequestMsg = "User=" + (Convert.ToString(UserLogin));
                HttpRequestMsg += "&Password=" + HttpUtility.UrlEncode(Convert.ToString(UserPassword));
                HttpRequestMsg += "&Application=appCardinal";
                HttpRequestMsg += "&dbbServiceName=svcIVRSecondaryCard";
                HttpRequestMsg += "&dbbSystemExtLogin=1";
                HttpRequestMsg += "&deDBBServiceApiLevel=1.2";


 HttpRequestMsg += AuthRequest;
                HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(BaseUrl);
                httpRequest.Method = "POST"; httpRequest.Headers.Add("X-Forwarded-For", objLoginUserInfo.HostIp); httpRequest.Headers.Add("Authorization", AddAuthorizationHeader());
                httpRequest.ContentType = "application/x-www-form-urlencoded";
                httpRequest.CookieContainer = new CookieContainer();

                string sOutput = string.Empty;
                sOutput = CommonBLL.GetDBBIDServiceResponse(httpRequest, HttpRequestMsg);



   public static string GetDBBIDServiceResponse(HttpWebRequest httpRequest, string httpRequestMsg)
    {
        string responseString = string.Empty;
        try
        {
            Utilities.APITraceEnable(httpRequestMsg);
            byte[] byteArray = Encoding.GetEncoding(1252).GetBytes(httpRequestMsg);
            httpRequest.ContentLength = byteArray.Length;
            Stream newStream = httpRequest.GetRequestStream(); //open connection
            newStream.Write(byteArray, 0, byteArray.Length); // Send the data.
            newStream.Close();
            HttpWebResponse getResponse = (HttpWebResponse)httpRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                responseString = sr.ReadToEnd();
            }
        }
        catch (Exception ex)
        {
            CreateLogFile.CreateActivityLog("CommonBLL GetEncodingWindows1252 Exception =============== " + ex.Message, ex.StackTrace);
        }
        return responseString;
    }

当用户输入 & char 时出现问题。 为了允许 & 我们可以使用 HttpUtility.UrlEncode ,但我不想使用 HttpUtility.Urlencode

请建议我如何在上述 API 调用中允许 & 和西类牙字符

最佳答案

您可以使用 %26 替换查询变量中的 & 符号。它算作相同(有点像 %20 相当于一个空格)。解析您的变量并将 & 替换为上面的代码,您应该已设置好。

例如,您可以编写 MyName%26Test123,它与 MyName&Test123 相同

参见 http://www.degraeve.com/reference/urlencoding.php作为用于替换字符的不同代码的引用

更新

根据我从您的 API 构造中看到的情况,您可以很容易地解决这个问题。您的所有数据都存储在一个类中,因此使用以下循环遍历每个属性

public void ParseAmpersand()
{
    foreach (PropertyInfo pi in this.GetType().GetProperties())
    {
        if (pi.PropertyType == typeof(string)
        {
            ((string)pi.GetValue(this)).Replace("&", "%26");
        }
    }               
}

这将循环遍历该对象中类型为 string 的所有属性,并将 & 替换为 %26 代码。您需要做的就是将它放入您已经创建的类 (SecCardReq) 中,并在构建 API 字符串之前调用它。

关于c# - 如何在没有url编码的情况下允许&在带有西类牙字符的url中的单词之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41996330/

相关文章:

c# - Windows RT - StorageFile 的同步使用

从数据库生成的 C# SEO URL

c# - 使用 SMTP 发送电子邮件不适用于 asp.net

.net - 基于 HTTP header 区分 MVC Controller 的最佳方法

c# - 合并从多个实例触发的事件的可观察序列的正确方法

c# - 分发 clickonce 应用程序的文件

c# - 如何读取 Windows 商店应用程序中的注册表值?

.net - Silverlight 本地化与响应式(Reactive)框架。如何?

c# - 只有第一次记录显示,除非强行处置

ASP.NET MVC 安全性 - 您应该在哪一层检查用户是否有权查看实体?