Добрый день!
Можно ли создать свой сервис наподобие сервиса лендинга, чтобы его можно было вызывать с других сайтов без авторизации?
Нравится
Говорят, что такая возможность для произвольного раздела появится в версии 7.9.
"Зверев Александр" написал:Говорят, что такая возможность для произвольного раздела появится в версии 7.9.
Ясненько, а не знаете, сейчас что-то подобное можно сделать самому?
Как-то так. Оф. ответ супорта. Только придется менять кучу конфигов.
Что-то кодировка сломалась. Вот, что там:
[code]
Здравствуйте, вот инструкция по написанию сервиса, вызывающего БП, доступного по HTTP\GET с передачей параметров в БП:
1. Вносим правки в наш «UsrLaunchProccService», во-первых, добавим Usr, как в имени схемы, так и имени класса по коду,
во-вторых, переписываем его как обычный веб-сервис, принимающий параметры по GET, а в его теле уже вызываем нужный нам БП с нужным нам параметром,
в нашем тесте это БП: UsrTestProcc с параметром UstTestPhone.
Бизнес процесс может быть любым, с любым количеством параметров, в данной инструкции наш тестовый БП не рассматривается,
единственное что, в процессе должен стоять флаг "сериализовать в сессию", должен стоять флаг "принудительная компиляция", и не стоять "сериализовать в БД", а также процесс не должен содержать тега,
суть вопроса в другом,
а именно в вызове его при получении GET запроса с параметром, с стороннего сайта\службы\сервиса\чего-угодно по протоколу HTTP,
итак, код сервиса во вложении (UsrLaunchProccService.txt), там написан как CORS, так и вызов БП, теперь доработаем конфиги что бы позволить вызывать сервис по урл:
http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc
2. В папке сайта в котором написан наш сервис, *сайт*\Terrasoft.WebApp\ServiceModel
Создаем файл «UsrLaunchProccService.svc»
В содержимое файла пишем:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.UsrLaunchProccService" CodeBehind="UsrLaunchProccService.svc.cs" %>
3. В папке *сайт* \Terrasoft.WebApp в файле Web.config рядом с другими локациями, добавляем:
4. В папке *сайт*\Terrasoft.WebApp\ в файле Web.config в секции appSettings меняем значение ключа AllowedLocations. В значение добавляем:
ServiceModel/UsrLaunchProccService.svc;
5. В папке *сайт*\Terrasoft.WebApp\ServiceModel\http в файле services.config в блоке сервисов добавляем:
6. В папке *сайт*\Terrasoft.WebApp\ServiceModel\https в файле services.config в блоке сервисов делаем то же самое, что и в пункте 5.
Все, сервис будет доступен по адресу:
http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc
К примеру в нашем локальном примере, вызов БП с параметром телефона "123" выглядит так:
http://localhost:8006/0/ServiceModel/UsrLaunchProccService.svc/runUsrTe…
[/code]
Но это просто запуск извне процесса с параметрами. Если нужно какой-то пользовательский интерфейс, как в лендинге, то придётся его делать вручную.
А у меня еще один вопрос появился. Знает ли кто как включить CORS? А то у меня запросы к локальной версии bpm с браузера не проходят, ругается что сервер не поддерживает CORS.
"Колебянов Виталий Романович" написал:Знает ли кто как включить CORS?
В сервисе:
[csharp]
[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
public void GetWebFormLeadDataRequestOptions()
{
var outgoingResponseHeaders = WebOperationContext.Current.OutgoingResponse.Headers;
outgoingResponseHeaders.Add("Access-Control-Allow-Origin", "*");
outgoingResponseHeaders.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
outgoingResponseHeaders.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source");
outgoingResponseHeaders.Add("Access-Control-Request-Headers", "X-Requested-With, x-request-source, accept, content-type");
}
[/csharp]
Здравствуйте. По выше описанному добавил web сервис. При вызове ему передаються текстовые данные в формате JSON.
[csharp]
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted() {
var Request = HttpContext.Current.Request;
StreamReader reader = new StreamReader(Request.InputStream);
string requestFromPost = reader.ReadToEnd();
string result = "chatStarted result: " + requestFromPost;
return result;
}
[/csharp]
Но при получении InputStream, возвращаеться ошибка: Этот метод или свойство не поддерживается после вызова HttpRequest.GetBufferlessInputStream."
System.Web.HttpRequest.BinaryRead(Int32 count)
в Terrasoft.Configuration.UsrChatraWebhooks.chatStarted()
в SyncInvokechatStarted(Object , Object[] , Object[] )
в System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs)
в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
в System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
Нашел статью https://stackoverflow.com/questions/21635815/how-should-i-use-httpreque…
добавил в Terrasoft.WebApp\web.config в configuration.appSettings
[xml]
[/xml]
После этого ошибка не повторяется, но InputStream пуст.
В чем может быть проблема? Может в BPM есть специальный способ для чтения тела входящего запроса?
Request.ContentLength > 0, .т.е. в теле запроса передается какая то информация.
"Дашкевич К." написал:Но при получении InputStream, возвращаеться ошибка:
Как-то слишком наворочено) Если надо принять строку, то [csharp]
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(string input) {...} ///автоматом десериализует в строку
[/csharp]
Если надо принять Json, мы делаем так:
[csharp]
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(newMessage input) {...} ///автоматом десериализует в объект, который предварительно надо описать
[DataContract]
public class newMessage
{
[DataMember]
public string testName { get; set; }
[DataMember]
public DateTime testDate { get; set; }
}
[/csharp]
Если надо stream, то там немного сложнее. придётся выкидывать RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json. Короче, лучше без стрима)
Попробовал ваш метод первый и второй:
[csharp]
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class UsrChatraWebhooks
{
[OperationContract]
[WebInvoke(Method = "OPTIONS", UriTemplate = "*")]
public void GetWebFormLeadDataRequestOptions()
{
var outgoingResponseHeaders =WebOperationContext.Current.OutgoingResponse.Headers;
outgoingResponseHeaders.Add("Access-Control-Allow-Origin", "*");
outgoingResponseHeaders.Add("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
outgoingResponseHeaders.Add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, X-Requested-With, X-Requested-With, x-request-source");
outgoingResponseHeaders.Add("Access-Control-Request-Headers", "X-Requested-With, x-request-source, accept, content-type");
}
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped,
RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
public string chatStarted(NewMessage input) {
var Request = HttpContext.Current.Request;
var lngCount = Request.ContentLength;
string tinput = "";
if (input != null) {
tinput = input.eventName;
}
string result = "ContentLength=" + lngCount.ToString() + "; input=" + tinput;
return result;
}
}
[DataContract]
public class NewMessage
{
[DataMember]
public string eventName { get; set; }
}
[/csharp]
Скрин запроса в приложение.
В обоих случаях input пустой.
Подскажите пожалуйста, в чем может быть проблема?
Ответ: {"chatStartedResult":"ContentLength=32; input="}
"Дашкевич К." написал:WebMessageBodyStyle.Wrapped
Посылаемый запрос должен быть обёрнут, поэтому либо:
[javascript]
{
NewMessage: {
eventName: "значение"
}
}
[/javascript]
либо [csharp]
WebMessageBodyStyle.Bare
[/csharp]
запрос(если оставляем класс NewMessage):
[javascript]
{
eventName: "значение"
}
[/javascript]
"Варфоломеев Данила" написал:WebMessageBodyStyle.Bareзапрос(если оставляем класс NewMessage):
{
eventName: "значение"
}
Спасибо большое, помогло.