Добрый день!

Можно ли создать свой сервис наподобие сервиса лендинга, чтобы его можно было вызывать с других сайтов без авторизации?

Нравится

12 комментариев

Говорят, что такая возможность для произвольного раздела появится в версии 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: "значение"
}

Спасибо большое, помогло.

Показать все комментарии