Добрый день!
Можно ли создать свой сервис наподобие сервиса лендинга, чтобы его можно было вызывать с других сайтов без авторизации?
Нравится
Говорят, что такая возможность для произвольного раздела появится в версии 7.9.
"Зверев Александр" написал:Говорят, что такая возможность для произвольного раздела появится в версии 7.9.
Ясненько, а не знаете, сейчас что-то подобное можно сделать самому?
Как-то так. Оф. ответ супорта. Только придется менять кучу конфигов.
Что-то кодировка сломалась. Вот, что там:
Здравствуйте, вот инструкция по написанию сервиса, вызывающего БП, доступного по 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 рядом с другими локациями, добавляем: <location path="ServiceModel/UsrLaunchProccService.svc"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> 4. В папке *сайт*\Terrasoft.WebApp\ в файле Web.config в секции appSettings меняем значение ключа AllowedLocations. В значение добавляем: ServiceModel/UsrLaunchProccService.svc; 5. В папке *сайт*\Terrasoft.WebApp\ServiceModel\http в файле services.config в блоке сервисов добавляем: <service name="Terrasoft.Configuration.UsrLaunchProccService"> <endpoint name="UsrLaunchProccServiceEndPoint" address="" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="Terrasoft.Configuration.UsrLaunchProccService" /> </service> 6. В папке *сайт*\Terrasoft.WebApp\ServiceModel\https в файле services.config в блоке сервисов делаем то же самое, что и в пункте 5. Все, сервис будет доступен по адресу: http(или https)://адрес-сайта/0/ServiceModel/UsrLaunchProccService.svc К примеру в нашем локальном примере, вызов БП с параметром телефона "123" выглядит так: http://localhost:8006/0/ServiceModel/UsrLaunchProccService.svc/runUsrTestProcc/123/
Но это просто запуск извне процесса с параметрами. Если нужно какой-то пользовательский интерфейс, как в лендинге, то придётся его делать вручную.
А у меня еще один вопрос появился. Знает ли кто как включить CORS? А то у меня запросы к локальной версии bpm с браузера не проходят, ругается что сервер не поддерживает CORS.
"Колебянов Виталий Романович" написал:Знает ли кто как включить CORS?
В сервисе:
[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"); }
Здравствуйте. По выше описанному добавил web сервис. При вызове ему передаються текстовые данные в формате JSON.
[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; }
Но при получении 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
<add key="wcf:serviceHostingEnvironment:useClassicReadEntityBodyMode" value="true" />
После этого ошибка не повторяется, но InputStream пуст.
В чем может быть проблема? Может в BPM есть специальный способ для чтения тела входящего запроса?
Request.ContentLength > 0, .т.е. в теле запроса передается какая то информация.
"Дашкевич К." написал:Но при получении InputStream, возвращаеться ошибка:
Как-то слишком наворочено) Если надо принять строку, то
[OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] public string chatStarted(string input) {...} ///автоматом десериализует в строку
Если надо принять Json, мы делаем так:
[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; } }
Если надо stream, то там немного сложнее. придётся выкидывать RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json. Короче, лучше без стрима)
Попробовал ваш метод первый и второй:
[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; } }
Скрин запроса в приложение.
В обоих случаях input пустой.
Подскажите пожалуйста, в чем может быть проблема?
Ответ: {"chatStartedResult":"ContentLength=32; input="}
"Дашкевич К." написал:WebMessageBodyStyle.Wrapped
Посылаемый запрос должен быть обёрнут, поэтому либо:
{ NewMessage: { eventName: "значение" } }
либо
WebMessageBodyStyle.Bare
запрос(если оставляем класс NewMessage):
{ eventName: "значение" }
"Варфоломеев Данила" написал:WebMessageBodyStyle.Bareзапрос(если оставляем класс NewMessage):
{
eventName: "значение"
}
Спасибо большое, помогло.