Добрый день! Возникла проблема с передачей в БП параметров при использовании POST.
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestUploadFiles
{
using System.IO;
using System.Net;
using System.Net.Http;
class Program
{
public class BPMonlineProcessEngineExample
{
// Uri приложения BPMonline.
private static string serverUri = "http://192.168.5.3/";
// Uri сервиса аутентификации BPMonline.
private static string authServiceUri = "ServiceModel/AuthService.svc/Login";
// Uri сервиса запуска процессов BPMonline.
private static string executeProcessMethodPath = "0/ServiceModel/ProcessEngineService.svc";
// Cookie аутентификации BPMonline.
public static CookieContainer AuthCookie { get; set; }
// Признак, прошла ли аутентификация на сервере BPMonline.
public static bool IsAuthentificated
{
get
{
return (AuthCookie != null);
}
}
// Метод для аутентификации запроса к веб-сервису BPMonline.
// Параметры:
// userName - имя пользователя BPMonline,
// userPassword - пароль пользователя BPMonline,
// solutionName - имя конфигурации BPMonline.
public static bool TryLogin(string userName, string userPassword, string solutionName)
{
// Формирование строки с аутентификационными данными.
string authString = @"{
""Language"":""Ru-ru"",
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @""",
""TimeZoneOffset"":-120
}";
byte[] authData = UTF8Encoding.UTF8.GetBytes(authString);
// Переменная, в которую будут помещены возвращенные сервером cookie в случае успешной аутентификации.
var cookieContainer = new CookieContainer();
// Формирование запроса к сервису аутентификации.
HttpWebRequest request = HttpWebRequest.Create(serverUri + authServiceUri) as HttpWebRequest;
request.Method = "POST";
request.CookieContainer = cookieContainer;
request.ContentType = "application/json";
using (var stream = request.GetRequestStream())
{
stream.Write(authData, 0, authData.Length);
}
// Получение ответа от сервера. Если аутентификация прошла успешно, сервер возвратит аутентификационные
// cookie, которые сохраняются в объекте. В дальнейшем эти cookie будут добавляться в запросы к веб-сервису
// без повторной аутентификации.
using (var response = request.GetResponse())
{
if (cookieContainer.Count > 0)
{
AuthCookie = cookieContainer;
return true;
}
}
return false;
}
}
public static void PostMultipleFiles(string url, string[] files)
{
string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
httpWebRequest.ContentType = "multipart/form-data; boundary=" + boundary;
httpWebRequest.Method = "POST";
httpWebRequest.KeepAlive = true;
//httpWebRequest.Credentials = System.Net.CredentialCache.DefaultCredentials;
httpWebRequest.CookieContainer = BPMonlineProcessEngineExample.AuthCookie;
Stream memStream = new System.IO.MemoryStream();
byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"";
Нравится
Здравствуйте, Акмаль!
Полагаю, что параметры не передаются или называются не так, как Вы к ним обращаетесь. Вы же добавили параметры "ContactName" и "ContactPhone" в Parameters процесса?
И еще, как-то странно у Вас передача происходит. Вот рабочий примерчик. Параметры передаются в виде строки вида «p1=v1&p2=v2&p3=v3...».
[csharp]
private const string serverUri = "http://localhost:7207/0/";
private const string authServiceUtri = "http://localhost:7207/ServiceModel/AuthService.svc/Login";
public static void startProcess(string userName, string userPassword, string processName, string parametersString)
{
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri + "ServiceModel/ProcessEngineService.svc/"
+ processName + "/Execute?" + parametersString);
var authRequest = HttpWebRequest.Create(authServiceUtri) as HttpWebRequest;
authRequest.Method = "POST";
authRequest.ContentType = "application/json";
var bpmCookieContainer = new CookieContainer();
authRequest.CookieContainer = bpmCookieContainer;
using (var requesrStream = authRequest.GetRequestStream())
{
using (var writer = new StreamWriter(requesrStream))
{
writer.Write(@"{
""UserName"":""" + userName + @""",
""UserPassword"":""" + userPassword + @""",
""TimeZoneOffset"":-120,
}");
}
}
using (var authResponse = (HttpWebResponse)authRequest.GetResponse())
{
request.Method = "POST";
request.Accept = "application/json";
request.ContentType = "application/json";
request.ContentLength = 0;
request.CookieContainer = bpmCookieContainer;
var response = (HttpWebResponse)request.GetResponse();
}
}
[/csharp]
Вот вызов:
[csharp]
string parametersString = "TaskContact=5178ef17-f882-4fc4-b7d4-8d2d245af929";
startProcess("Supervisor", "Supervisor", "TestProcess", parametersString);
[/csharp]
Акмаль, нет. Слать файлы не получится, но можно ведь передать ссылку на файл, если он размещен на ресурсе, доступном с сервера приложений.
Здравствуйте!
Стоит Задача интеграции сайта с BPMOnline, c сайта нужно передать много данных в BPMOnline. В бпмке создали процесс который ждет 1 параметр строку (сериализованный json) вызов процесса делаем. если все передавать в Url параметрах то данные приходят, но на сервере стоит ограничение на размер Get запроса. Можно ли в БП передать параметр из тела POST- запроса?
Shamil, так вроде бы POST-запрос и используется. В любом случае, стоит попробовать. Можете перейти по адресу http(s):bpmonline_site/0/ServiceModel/ProcessEngineService.svc/help для получения возможных способов обращения к веб-сервису.
Shamil, приведите, пожалуйста, пример того, как Вы отправляете запрос, тчобы я мог воспроизвести ситуацию, а также указите версию системы, которую используете.
Спасибо!
Андрей, спасибо.
Я разобрался в БП получаю параметры из формы напрямую с веб-запроса:
[csharp]
var form = HttpContext.Current.Request.Form;
var data = form["Data"];
[/csharp]
В принципе такое решение устраивает нас.
Версия 7.2
Но параметры из тела post-запроса в параметры БП так и не передаются.
Вызов делаю так:
[csharp]
public static void SendData(string processName, object data)
{
var strData = JsonConvert.SerializeObject(data);
var url = Path.Combine(serverUri + executeProcessMethodPath + "/"
+ processName + "/Execute");
using (var client = new CookieWebClient(AuthCookie))
{
try
{
client.Encoding = Encoding.UTF8;
client.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
var str = client.UploadString(url, "Data=" + strData);
}
catch (WebException ex)
{
using (var reader = new StreamReader(ex.Response.GetResponseStream()))
{
var s = reader.ReadToEnd();
}
}
}
}
[/csharp]
Shamil, я уточню информацию по этой теме, и отпишусь, как только получу результаты.
Столкнулся с проблемой запуска процесса с передачей параметра постом:
[csharp]
public static void startProcess(/*string userName, string userPassword, */string processName, string parametersString)
{
var request = (HttpWebRequest)HttpWebRequest.Create(serverUri + executeProcessMethodPath + "/" + processName + "/Execute?" + parametersString);
try
{
request.Method = "POST";
request.Accept = "application/json";
request.ContentType = "application/json";
request.ContentLength = 0;
request.CookieContainer = AuthCookie;
using (var response = (HttpWebResponse)request.GetResponse())
{
var result = new StreamReader(response.GetResponseStream()).ReadToEnd();
File.AppendAllText("c:\\emailLogs", "result = " + result + Environment.NewLine);
}
}
catch (Exception ex)
{
File.AppendAllText("c:\\emailLogs", ex + Environment.NewLine);
}
}
public static bool AddLoan(string data)
{
if (!IsAuthentificated)
{
return false;
}
else startProcess("SiteRequestProcess", "Data=" + data);
return true;
}
[/csharp]
В таком виде сервер возвращает 404, но если передать короткую строку, например
[csharp]
startProcess("SiteRequestProcess", "Data=" + "data");
[/csharp]
то тогда процесс запускается. Возможно проблема в длине строки? Есть ли другой способ отправить пост с параметром на сервер?
Добрый день.
К сожалению, передача параметров в потоке метода POST в текущих версиях bpm’online не реализована.
Параметры можно передавать только в URL запроса. При этом существует ряд ограничений на длину URL:
- ограничения веб-серверов и браузеров - https://github.com/dreikanter/paradigm.ru/blob/master/posts/2007-12-19_url-max-length.md
- ограничения класса Uri в NET.Framework - https://msdn.microsoft.com/en-us/library/vstudio/z6c2z492(v=vs.110).aspx
Акмаль, на мой взгляд, ошибка в том, что Вы при формировании POST-запроса параметры записали в адресную строку, что неправильно.
См.
https://msdn.microsoft.com/en-us/library/debx8sh9(v=vs.110).aspx
http://stackoverflow.com/questions/4015324/http-request-with-post
А в описании методов сервиса написано, что Execute все-таки можно вызвать POST'ом.