Я на самом деле кодирую REST-сервер, используя Visual C ++.
Это мой сервер:
Файл IRestServer.h:
using namespace System;
using namespace System::ServiceModel;
using namespace System::ServiceModel::Web;
[ServiceContract(Name = "MyRESTServer")]
public interface class IRestServer
{
[OperationContract]
[WebGet(UriTemplate = "/ping", ResponseFormat = WebMessageFormat::Json, BodyStyle = WebMessageBodyStyle::Bare)]
virtual bool Ping() = 0;
};
файл main.h:
[ServiceBehavior(InstanceContextMode = InstanceContextMode::Single, ConcurrencyMode = ConcurrencyMode::Single, IncludeExceptionDetailInFaults = true)]
public ref class TRestServerEx : public System::Windows::Forms::Form, public IRestServer
{
public:
TRestServerEx(void)
{
[...]
this->OpenRestServer();
}
~TRestServerEx()
{
[...]
}
public:
bool AddCors()
{
WebOperationContext::Current->OutgoingResponse->Headers->Add("Access-Control-Allow-Origin", "*");
if (WebOperationContext::Current->IncomingRequest->Method == "OPTIONS")
{
WebOperationContext::Current->OutgoingResponse->Headers->Add("Access-Control-Allow-Methods", "POST, OPTIONS, GET");
WebOperationContext::Current->OutgoingResponse->Headers->Add("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, x-requested-with");
return false;
}
return true;
}
virtual bool Ping() override
{
if (this->AddCors() == false)
return nullptr;
return true;
}
void OpenRestServer()
{
String^ err;
try
{
this->_serviceHost = gcnew WebServiceHost(this, gcnew Uri("http://localhost:4242/ServerEx"));
this->_serviceHost->Open();
}
catch (Exception^ e)
{
err = e->ToString();
}
}
private:
WebServiceHost^ _serviceHost;
};
main.cpp file :
[STAThreadAttribute]
void Main(array<String^>^ args)
{
TRestServerEx^ frm = gcnew TRestServerEx();
Application::Run(frm);
}
Сервер работает нормально.
Я сейчас пытаюсь получить доступ к серверу REST с защищенного веб-сервера (с помощью запросов ajax), но получаю ошибку SSL: net::ERR_SSL_PROTOCOL_ERROR
Так что мне нужен мой REST-сервер для включения аутентификации SSL.
Что я пробовал:
Я пробовал много кода, но это не легко адаптировать ASP.net в Visual C ++.
Я пытался добавить https
в свой базовый адрес:
this->_serviceHost = gcnew WebServiceHost(this, gcnew Uri("https://localhost:4242/ServerEx"));
Но я получаю ошибку выполнения при открытии службы: «Невозможно найти базовый адрес, соответствующий схеме https [...]» *
Я нашел этот кусок кода:
WebHttpBinding^ secureWebHttpBinding = gcnew WebHttpBinding(WebHttpSecurityMode::Transport);
secureWebHttpBinding->Name = "secureHttpWeb";
this->_serviceHost->AddServiceEndpoint("IRestServer", secureWebHttpBinding, ""));
Но когда я его добавляю, сервер не отвечает ни на какие запросы.
У меня есть сомнения по поводу первого и последнего параметра в методе AddServiceEndpoint
.
«IrestServer» является строковым представлением моего сервисного контракта, но это хороший способ передать его в параметре?
Я пробовал с decltype
, но он не компилируется:
this->_serviceHost->AddServiceEndpoint(decltype(IRestServer), secureWebHttpBinding, ""));
Я уверен, что не так далеко от правильного способа написания декларации сервера, но я что-то упустил.
Заранее спасибо за помощь,
Батист