Подключение к веб-сервису без использования Web.Config - PullRequest
0 голосов
/ 27 марта 2019

Я разработал плагин Payment Gateway для SagePay South Africa, который будет использоваться с платформой электронной коммерции nopCommerce (v3.90).Сам плагин работает отлично, однако SagePay требует, чтобы плагин проверял идентификатор продавца и сервисный ключ во время установки и настройки плагина.Это делается с помощью веб-службы, предоставляемой SagePay, Южная Африка.

Я использую Visual Studio 2017. Плагин представляет собой веб-приложение, расширяющее функциональные возможности nopCommerce и основанное на ASP.NET MVC 5, wriiten.в C #.

Добавление веб-службы SagePay в качестве «Подключенной службы» на моем ПК для разработки не представляет проблемы.Когда я тестирую плагин, процесс проверки работает отлично.Однако при развертывании плагина на тестовом сервере я могу заставить плагин работать только в том случае, если я скопирую настройки конфигурации конечной точки (Web.Config) из папки плагина в корневой файл Web.Config установки nopCommerce.

Это проблема, поскольку мы не хотим, чтобы клиенты, загружающие плагин, должны были вручную редактировать / изменять корневой файл Web.Config.

Так что мой вопрос: как подключиться?в веб-службу, указав параметры конечной точки в коде контроллера и при этом обходя необходимость для подключаемого модуля получать параметры конфигурации конечной точки из корневого файла Web.Config?

Когда плагин установлен наНа тестовом сервере в папке плагина существует файл web.config, в котором содержатся параметры конфигурации конечной точки для веб-службы.Как я обнаружил, это не работает, так как плагин ищет корневой файл Web.Config для этих настроек.

Если я вручную добавлю эти настройки в корневой Web.Config, плагин работает отлично, но какЯ заявил, что мы не хотим, чтобы пользователи вручную редактировали основной файл Web.Config, по понятным причинам.

Это файл Web.Config в подпапке плагина - мне нужно добавить его прямо вКонтроллер:

  <system.serviceModel>
      <bindings>
          <wsHttpBinding>
              <binding name="WSHttpBinding_INIWS_Partner">
                  <security mode="Transport">
                      <transport clientCredentialType="None" />
                  </security>
              </binding>
          </wsHttpBinding>
      </bindings>
      <client>
          <endpoint 
              address="https://ws.sagepay.co.za/NIWS/NIWS_Partner.svc"
              binding="wsHttpBinding" 
              bindingConfiguration="WSHttpBinding_INIWS_Partner"
              contract="NIWS.INIWS_Partner" 
              name="WSHttpBinding_INIWS_Partner" />
      </client>
  </system.serviceModel>  

=================================================

Ниже приведены два метода, для которых требуется вышеуказанный веб-сервис:

using Nop.Plugin.Payments.SagePay.NIWS;

protected ServiceInfoList GetServiceInfo(string pServiceID, string pServiceKey)
{

        ServiceInfo serviceInfo = new ServiceInfo
    {
        ServiceId = pServiceID,
        ServiceKey = pServiceKey
    };

    ServiceInfoList serviceInfoList = new ServiceInfoList
    {
        serviceInfo
    };

    return serviceInfoList;
}

protected void ValidateServiceKey(string AccountNumber, string PayNowKey)
{

    //initialise all operations needed
    //---------------------------------------
    ServiceInfoList serviceInfoList = new ServiceInfoList();
    NIWS_PartnerClient client = new NIWS_PartnerClient();
    ValidateServiceKeyRequest validateServiceKeyRequest = new ValidateServiceKeyRequest();
    //---------------------------------------

    string SoftwareVendorKey = "******-****-****-****-************";

    //Populating request to validate
    //---------------------------------------

    //Add account number to MerchantAccount
    validateServiceKeyRequest.MerchantAccount = AccountNumber;

    //Add Vendor key issued by Sage Pay
    validateServiceKeyRequest.SoftwareVendorKey = SoftwareVendorKey;

    //checks if field was populated
    if (PayNowKey != null)
    {
        serviceInfoList = GetServiceInfo("14", PayNowKey);
    }

    //Add service info list to request
    validateServiceKeyRequest.ServiceInfoList = serviceInfoList;

    //---------------------------------------
    //Calling the ValidateServiceKey method validating account number with the service keys added
    var Request = client.ValidateServiceKey(validateServiceKeyRequest);

    //Do a check on the response for Account Status
    //001 = valid
    if (Request.AccountStatus == "001")
    {
        //do something, eg. output if account active
        //then add service info to list to check on each service status
        sageAccountStatus = Request.AccountStatus;

        ServiceInfoResponseList serviceInfoResponseList = new ServiceInfoResponseList();
        serviceInfoResponseList = Request.ServiceInfo;
        foreach (var s in serviceInfoResponseList)
        {
            string service = s.ServiceId;
            switch (service)
            {
                case "14": // Pay Now Service Status
                    sagePayNowStatus = s.ServiceStatus;
                    break;
                default:
                    break;
            }
        }
    }
    else
    {

        sageAccountStatus = Request.AccountStatus;
    }

    client.Close();
}

Я бы хотел, чтобы плагин определял настройки вТаким образом, файл Web.Config напрямую не связан с контроллером, что устраняет необходимость в файле Web.Config.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...