Сделал сервис для .netcore по стате https://academy.terrasoft.ru/docs/developer/back-end_development/config…

Обращаюсь к сервису из вкладки браузера после входа в систему http://172.23.1.117/rest/UsrCustomConfigurationService/SomeMethod

но получаю сообщение 404 (Creatio развернуто в докере, докер перезапускал, все компилировал). Прошу подсказать что еще можно сделать чтоб сервис заработал?

 

 namespace Terrasoft.Configuration.UsrCustomConfigurationService
{
    using System;
    using System.Collections.Generic;
    using System.Security;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;
    using System.Web.SessionState;
    using Terrasoft.Common;
    using Terrasoft.Core;
    using Terrasoft.Core.DB;
    using Terrasoft.Core.Factories;
    using Terrasoft.Core.ServiceModelContract;
    using Terrasoft.Web.Common;
    using Terrasoft.Web.Http.Abstractions;
 
     #region Class: UsrCustomConfigurationService
 
    [ServiceContract]
 
     [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
 
    public class UsrCustomConfigurationService: BaseService
    {
        #region Methods: Public
        /* Метод веб-сервиса. */
        [OperationContract]
        [WebInvoke(Method = "GET", UriTemplate = "SomeMethod", 
            BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json,
            ResponseFormat = WebMessageFormat.Json)]
        public string SomeMethod() {
            
            var httpContext = HttpContext.Current;
            return "12345";
        }
        #endregion
    }
    #endregion
}

 

Нравится

2 комментария
Лучший ответ

Столкнулись с похожей проблемой -- нам помогла перезагрузка :)

Столкнулись с похожей проблемой -- нам помогла перезагрузка :)

Вадим Курунов,

Спасибо, помогло! Надеюсь в следующих релизах такое не потребуется

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

Добрый день.



Подскажите, пожалуйста, есть ли возможность в web service для "data type: object" установить тип данных объект, а не массив с объектами?



https://prnt.sc/132ydy4

Нравится

1 комментарий

Добрый день!

Нет, подобную настройку выполнить нельзя. Это не имеет смысла поскольку сам объект это есть контейнер для других полей. Уточните какую задачу Вы решаете, возможно, мы сможем подсказать как ее можно будет выполнить.

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

Доброго времени суток! Коллеги, помогите пожалуйста с переводом запроса SQL на С# для использования в конфигурационном веб-сервисе. Необходимо через запрос к веб-сервису по ИНН контакта получать в ответе перечень Id заявок и Названий их статусов. SQL запрос выглядит так:

 

SELECT a.Id, s.Name

FROM dbo.Application a

INNER JOIN dbo.Contact c ON a.ContactId = c.Id

INNER JOIN dbo.AppStatus s ON a.StatusId = s.Id

WHERE c.INNN='1234567890'

 

Нравится

15 комментариев
Лучший ответ

Здравствуйте! В данной статье описано как работать с классом EntitySchemaQuery и как строить пути к колонкам, а в данной статье показано как получить данные из запроса.

Здравствуйте! В данной статье описано как работать с классом EntitySchemaQuery и как строить пути к колонкам, а в данной статье показано как получить данные из запроса.

Сделал согласно информации в указанных статьях:

        public string UsrGetAppInfoByINN(string INN) {
            // Результат по умолчанию.
            var result = "";
            // Экземпляр EntitySchemaQuery, обращающийся в таблицу Application базы данных.
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            // Добавление колонок в запрос.
            esqQuery.AddColumn("Id");
            esqQuery.AddColumn("[AppStatus:Id:StatusId].Name");
            esqQuery.AddColumn("[Contact:Id:ContactId].INN");
               // Фильтрация данных запроса.
            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "INN", INN);
            esq.Filters.Add(esqFilter);
            // Получение результата запроса.
            string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText(); 
            // Возвратить результат.
            return result;

При публикации получаю ошибки "The name 'esq' does not exist in current context в строках:   

            var esqFilter = esq.CreateFilterWithParameters(FilterComparisonType.Equal, "INN", INN);
            esq.Filters.Add(esqFilter);

            esq.Filters.Add(esqFilter);

Так у Вас переменная называется esqQuery, а не esq.

Зверев Александр,

заменил esq на esqQuery. Схема публикуется, но на запрос приходит ошибка: 

The server encountered an error processing the request. The exception message is 'Элемент коллекции с именем StatusId не найден'. 

Если убрать эту строку из кода - ругается на следующую ContactId, хотя обе эти колонки есть в таблице Application

        public string UsrGetAppInfoByContactINN(string INN) {
            // Результат по умолчанию.
            var result = "";
            // Экземпляр EntitySchemaQuery, обращающийся в таблицу Application базы данных.
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            // Добавление колонок в запрос.
            esqQuery.AddColumn("INN");
            esqQuery.AddColumn("[AppStatus:Id:StatusId].Name");
            esqQuery.AddColumn("[Contact:Id:ContactId].INN");
               // Фильтрация данных запроса.
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "INN", INN);
            esqQuery.Filters.Add(esqFilter);
            // Получение результата запроса.
            string esqSqlText = esqQuery.GetSelectQuery(UserConnection).GetSqlText(); 
            // Возвратить результат.
            return result;

Что я делаю не так?

Нужно писать названия полей без Id, см. примеры по ссылке выше.

Зверев Александр,

не понимаю почему без Id, если колонки в таблице так и называются: ContactId, StatusId, но это помогло, спасибо.

 

Правда теперь после отправки запроса - я получаю пустой ответ на запрос:

{"UsrGetAppInfoByContactINN":""}

 

Александр О,

здравствуйте! Далее Вам необходимо получить коллекцию

var collection = esqQuery.GetEntityCollection(UserConnection);
if(collection.Count > 0)
{
  foreach(var entity in collection)
  {
     var name = entity.GetTypedColumnValue<string>("Name");
  }
}

 Примерно так.

Только еще один момент, Вам необходимо получить названия колонок  в esqQuery, что бы потом можно было выбирать из коллекции по имени.

var appColName = esqQuery.AddColumn("[AppStatus:Id:StatusId].Name").Name;
 
var collection = esqQuery.GetEntityCollection(UserConnection);
if(collection.Count > 0)
{
  foreach(var entity in collection)
  {
     var name = entity.GetTypedColumnValue<string>(appColName);
  }
}



 

Александр О пишет:

не понимаю почему без Id, если колонки в таблице так и называются

Оно в этом случае не пишется, при генерации запроса подставляется автоматически.

Нигрескул Алексей,

с помощью Ваших рекомендаций и дополнительных танцев с бубном схема видоизменилась на:

        public string UsrGetAppInfoByContactSSN(string ContactINN) {
            var result = "";
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            var appColApplicationId = esqQuery.AddColumn("Id").Name;
            var appColStatus = esqQuery.AddColumn("Status.Name").Name;
            var appColINN = esqQuery.AddColumn("Contact.INN").Name;
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact.INN", ContactINN);
            esqQuery.Filters.Add(esqFilter);
            var collection = esqQuery.GetEntityCollection(UserConnection);
                if(collection.Count > 0)
                    {
                      foreach(var entity in collection)
                        {
            var name = ("ApplicationId:").ToString() + entity.GetTypedColumnValue<string>(appColApplicationId)
                   +(", Status:").ToString() + entity.GetTypedColumnValue<string>(appColStatus)
                   +(", INN:").ToString() + entity.GetTypedColumnValue<string>(appColINN);
            return name;
                        }
                     }
            return result;

 В результате в ответ на запрос получаю:

{"UsrGetAppInfoByContactSSNResult":"ApplicationId:cee41684-295b-4384-8dfb-1fa3fdd835cc, Status:Підтверджена, INN:4562378478"}

Но это только одна запись.

Что нужно изменить в схеме чтобы в ответе приходили все найденные записи? Например так:

{"UsrGetAppInfoByContactSSNResult":
"ApplicationId:a913e1c5-6e83-428c-b095-0cf1b3aca5bf, Status:Підтверджена, INN:4562378478"
"ApplicationId:cee41684-295b-438e-8dfb-1fa3fdd835cc, Status:В роботі, INN:4562378478"
"ApplicationId:47a7a0be-4c21-430f-9da9-7d1b658cff92, Status:Відмовлено, INN:4562378478"
}

 

Александр О,

здравствуйте! В таком случае я бы сделал так:

public class AppInfoByContactSSN
{
 public Guid ApplicationId {get;set;}
 public string StatusName {get;set;}
 public string Inn {get; set;}
}
 
public List<AppInfoByContactSSN> UsrGetAppInfoByContactSSN(string ContactINN) {
            var result = new List<AppInfoByContactSSN>();
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            var appColApplicationId = esqQuery.AddColumn("Id").Name;
            var appColStatus = esqQuery.AddColumn("Status.Name").Name;
            var appColINN = esqQuery.AddColumn("Contact.INN").Name;
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact.INN", ContactINN);
            esqQuery.Filters.Add(esqFilter);
            var collection = esqQuery.GetEntityCollection(UserConnection);
                if(collection.Count > 0)
                {
                      foreach(var entity in collection)
                        {
                           result.Add(new AppInfoByContactSSN {
					ApplicationId = entity.GetTypedColumnValue<Guid>(appColApplicationId),
					StatusName = entity.GetTypedColumnValue<string>(appColStatus),
					Inn = entity.GetTypedColumnValue<string>(appColINN)
				});
                        }
                 }
 
             return result;  
}

 

Нигрескул Алексей,

пришлось еще добавить в using System.Collections.Generic;

Но при публикации на строку:

public List<AppInfoByContactSSN> UsrGetAppInfoByContactSSN(string ContactINN) {

выдает ошибку: a namespace cannot directly contain members such us fields or methods.

 

Полный код:

namespace Terrasoft.Configuration.UsrCustomNamespace
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Core.Entities;
    using System.Collections.Generic;
 
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
     public class AppInfoByContactSSN
       {
        public Guid ApplicationId {get;set;}
        public string StatusName {get;set;}
        public string Inn {get; set;}
       }
 
        [OperationContract]
        [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
 
        public List<AppInfoByContactSSN> UsrGetAppInfoByContactSSN(string ContactINN) {
            var result = new List<AppInfoByContactSSN>();
            var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");
            var appColApplicationId = esqQuery.AddColumn("Id").Name;
            var appColStatus = esqQuery.AddColumn("Status.Name").Name;
            var appColINN = esqQuery.AddColumn("Contact.INN").Name;
            var esqFilter = esqQuery.CreateFilterWithParameters(FilterComparisonType.Equal, "Contact.INN", ContactINN);
            esqQuery.Filters.Add(esqFilter);
            var collection = esqQuery.GetEntityCollection(UserConnection);
             if(collection.Count > 0)
                {
                 foreach(var entity in collection)
                  {
                    result.Add(new AppInfoByContactSSN {
                    ApplicationId = entity.GetTypedColumnValue<Guid>(appColApplicationId),
                    StatusName = entity.GetTypedColumnValue<string>(appColStatus),
                    Inn = entity.GetTypedColumnValue<string>(appColINN)
                   });
                  }
                }
            return result;
     }
}

 

Так у Вас метод не внутри класса, а после, потому и ругается. Метод должен быть в классе, а не в окружающем его namespace.

Зверев Александр,

так тоже пробовал, но на строку:

var esqQuery = new EntitySchemaQuery(UserConnection.EntitySchemaManager, "Application");

выдает ошибку:

An object reference is required for t he non-static field, method, or property 'User.Connection.EntitySchemaManager'

 

и на строку:

var collection = esqQuery.GetEntityCollection(UserConnection);

выдает ошибку:

'UserConnection' is a type, which is not valid in the given context

 

Александр, значит, у Вас в переменной UserConnection не то, что должно там быть. Попробуйте поискать в конфигурации или на этом  сайте примеры, как правильно делать. А если выдаёт ошибку, то по её тексту можно найти поиском в Интернете более подробное пояснение, что это означает.

 

Пример создания сервиса есть тут. Как минимум, у Вас не хватает наследования класса от BaseService.

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

Добрый день, коллеги! 

Есть задача: сделать веб-сервис, принимающий на вход сложное json-тело.

В ходе реализации столкнулась с двумя проблемами:

1. Не нашла, как описать прием сложного параметра в сервисе, кроме робкого указания на модификаторы [DataContract] и [DataMember]. Подскажите, где-нибудь есть информация об этом? 

2. При вызове из Postman сервис возвращает ответ "403 - Вы не имеете разрешения на просмотр этого каталога пли страницы." (скриншот ниже). Нужно ли где-то отдельно прописывать права на доступ к сервисам?

 

Скриншот ошибки:

Изображение удалено.

Листинг пример json тела запроса.

{
"scoring_events" : [
		{
			"type" : "pageview",
			"page_url" : "https://bpmonline.com/",
			"datetime_utc" : "2018-08-08 12:00:12",
			"responsible_user" : {
				"name" : "Иван Иванов",
				"email" : "i.ivanov@yandex.ru",
				"type" : "user"
			},
			"partner" : {
				"name" : "ООО Ромашка"
				"bpm_id" : "783967ef-c629-4f1d-8cd4-3b3dba955ffc",
				"contact_email" : "n.ivanova@yandex.ru"
			}
		},
		...
		{
			...
		}
	]
}

 

листинг сервиса:

namespace Terrasoft.Configuration.WScoringService
{
	using System;
<...>
#region Class: WScoringService 
	[ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class WScoringService : BaseService
	{
        private WScoringServiceResponse wScoringServiceResponse;
 
        #region Methods: Public
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string AddScoringEvent(List<ScoringEvent> scoring_events)
        {
            if (scoring_events.IsEmpty()) wScoringServiceResponse = new WScoringServiceResponse(true, "empty");
            else wScoringServiceResponse = new WScoringServiceResponse(true, scoring_events[0].ToString());
            return wScoringServiceResponse.ToJsonString();
        }
        #endregion
        #region  DataContract
	    [DataContract]
	    public class ScoringEvent
	    {
	    	[DataMember]
	        public string type;
	        [DataMember]
	        public string page_url;
	        [DataMember]
	        public string datetime_utc;
	        [DataMember]
	        public ResponsibleUser responsible_user;
	        [DataMember]
	        public Partner partner;
	        public override string ToString()
	        {
	            string result;
	            result = "type=" + type + ";";
	            result += "page_url=" + page_url + ";";
	            result += "datetime_utc=" + datetime_utc + ";";
	            result += "responsible_user_name=" + responsible_user.name + ";";
	            result += "partner_name=" + partner.name + ";\n";
	            return result;
	        }
	    }
	    [DataContract]
	    public struct ResponsibleUser
	    {
	    	[DataMember]
	        public string name;
	        [DataMember]
	        public string email;
	        [DataMember]
	        public string type;
	    }
	    [DataContract]
	    public struct Partner
	    {
	    	[DataMember]
	        public string name;
	        [DataMember]
	        public string bpm_id;
	        [DataMember]
	        public string contact_email;
	    }
	    #endregion
    }
    #endregion
 
    #region Class: WScoringServiceResponse
    public class WScoringServiceResponse
    {
        private bool success;
        private string message;
        public WScoringServiceResponse() { }
        public WScoringServiceResponse(bool success, string message = null)
        {
            this.success = success;
            this.message = message;
        }
        public string ToJsonString()
        {
            string result = "{\"status\":\"";
            if (success) result += "ok\",";
            else result += "error\",";
            result += "\"message\":\"" + message+ "\"}";
            return result;
        }
    }
    #endregion
}

 

Нравится

2 комментария

Примеры сервисов можно найти в конфигурации. Например, [DataContract] и [DataMember] применяют в CurrentUserService так:

[DataContract]
public class UserCultureInfo
{
	[DataMember(Name = "timeZoneCode")]
	public string TimeZoneCode { get; set; }
 
	[DataMember(Name = "timeZoneName")]
	public string TimeZoneName { get; set; }
 
	[DataMember(Name = "timeZoneId")]
	public Guid TimeZoneId { get; set; }
 
	[DataMember(Name = "cultureId")]
	public Guid CultureId { get; set; }
 
	[DataMember(Name = "cultureName")]
	public string CultureName { get; set; }
 
	[DataMember(Name = "cultureLanguage")]
	public string CultureLanguage { get; set; }
 
	[DataMember(Name = "dateTimeFormatId")]
	public Guid DateTimeFormatId { get; set; }
 
	[DataMember(Name = "dateTimeFormatName")]
	public string DateTimeFormatName { get; set; }
}

По поводу 403, такое бывает, если при отправке запроса к сервису не передать CSRF-токен.

И вот я пишу другой подобный сервис, привожу пример, который у меня заработал

 

Данные, которые отправляются в сервис:

{
    "WCases": [{
            "message": "webinar test",
            "user_crm_id": "CFAC23D8-8EEA-4EB6-A257-0001538F0723"
        }, {
            "message": "webinar test 2",
            "user_crm_id": "CFAC23D8-8EEA-4EB6-A257-0001538F0723"
        }
    ]
}

Код сервиса:

namespace Terrasoft.Configuration.WCaseService
{
    using System;
    using System.ServiceModel;
    using System.ServiceModel.Web;
    using System.ServiceModel.Activation;
    using System.Collections.Generic;
    using Terrasoft.Core;
    using Terrasoft.Web.Common;
    using Terrasoft.Configuration.Slack;
    using System.Runtime.Serialization;
 
    #region WCaseService
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    public class WCaseService : BaseService
    {
        #region init
        private SystemUserConnection _systemUserConnection;
        private SystemUserConnection SystemUserConnection
        {
            get
            {
                return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
            }
        }
        #endregion
        #region main: endPoints
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
        ResponseFormat = WebMessageFormat.Json)]
        public string ImportData(List&lt;WCaseTemplate&gt; WCases)
        {
            string result = "";
 
            if (WCases != null)
            {
                foreach (WCaseTemplate wCasein WCases)
                {
                    result += "message: " + wCase.UserMessage + "\nuser_crm_id: " + wCase.UsrLoginId.ToString() + "\n";
                }
            }
            else result = "NULL";
 
            return result;
        }
        #endregion
    }
    #endregion
    [DataContract]
    public class WCaseTemplate
    {
        [DataMember(Name = "message")]
        public string UserMessage { get; set; }
 
        [DataMember(Name = "user_crm_id")]
        public Guid UsrLoginId { get; set; }
    }
}

 

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

Добрый день!

Подскажите, как корректно добавить блок behaviorExtensions в конфиг системы.

Добавил блок 

<behavior>

<log4net />

</behavior><br />
<br />
И в блоке RestServiceBehavior добавил log4net




<behavior name="RestServiceBehavior"><br />
            <errorHandler/><br />
            <matchAllMessage/>

            <log4net

/><br />
            <threadContextInitializer/><br />
            <serviceMetadata httpGetEnabled="true" /><br />
            <serviceDebug includeExceptionDetailInFaults="true"  /><br />
        </behavior>

в файл behaviours.config



В Web.config в Terrasoft.WebApp.

<extensions>

<behaviorExtensions>

<add name="log4net"

type="Integration.Log4NetBehaviorExtensionElement, Integration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

</behaviorExtensions>

</extensions>



Класс Log4NetBehaviorExtensionElement также определил в Integration.



После чего возникают ошибки при попытке залогиниться в систему с сервисом. Подскажите как корректно настроить конфиги.

Нравится

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

Добрый день.

<behaviorExtensions> нужно прописывать в Extensions.config (там же написаны некоторые рекомендации). Ваш класс должен наследоваться от абстрактного класса «BehaviorExtensionElement» (namespace System.ServiceModel.Configuration). Проверьте ваш класс на доступность в БП или сервисе пред его записью в behaviorExtensions.

VladKapitanchyk,

 

Влад, добрый день!

Подскажите, пожалуйста, что значит:

<!-- Значения атрибутов type изменяются при автосборке. При добавлении/удалении/изменении содержимого оповестить ответственного за автосборку! -->

Каким образом необходимо уведомить ответственного за автосборку?

Тетиков Дмитрий Владимирович,

Добрый день.

На этот комментарий можете не обращать внимание, это относится к старой логике. Посмотрите на версию вашего extension, там указывается версия сборки, возьмите такую же, как и в предыдущих extensions.

VladKapitanchyk, 

Влад, сделал согласно рекомендациям. Первоначально была ошибка 

Exception Message: Не удалось загрузить тип "ArdsinBankCode.Integration.Log4NetBehaviorExtensionElement, ArdsinBankCode.Integration, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null", зарегистрированный для расширения "log4net". (D:\TSroot\ArdshinBank7102-2\Terrasoft.WebApp\ServiceModel\http\behaviors.config line 29)

Exception Type: System.Configuration.ConfigurationErrorsException

Exception Source: System.Configuration в логах Application.



После правки версии ошибки не возникает, однако ошибка вызова сервиса при авторизации осталась. 

Класс при вызове из БП доступен.

Подскажите, какие еще могут быть нюансы, пожалуйста.

&lt;extensions&gt;
  &lt;behaviorExtensions&gt;
    &lt;!-- Делать разрывы строк внутри атрибута type запрещено! --&gt;
    &lt;!-- Значения атрибутов type изменяются при автосборке. При добавлении/удалении/изменении содержимого оповестить ответственного за автосборку! --&gt;
    &lt;add name="errorHandler" type="Terrasoft.Web.Common.ServiceModel.ErrorHandlerElement, Terrasoft.Web.Common, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
    &lt;add name="matchAllMessage" type="Terrasoft.Web.Common.ServiceModel.MatchAllMessageElement, Terrasoft.Web.Common, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
    &lt;add name="threadContextInitializer" type="Terrasoft.Web.Common.ServiceModel.ThreadContextInitializerElement, Terrasoft.Web.Common, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
	&lt;add name="log4net" type="ArdsinBankCode.Integration.Log4NetBehaviorExtensionElement, ArdsinBankCode.Integration, Version=7.10.2.1416, Culture=neutral, PublicKeyToken=edaadfbc3b0bb879" /&gt;
  &lt;/behaviorExtensions&gt;
&lt;/extensions&gt;
 
&lt;behavior name="RestServiceBehavior"&gt;
			&lt;errorHandler/&gt;
			&lt;matchAllMessage/&gt;
			&lt;log4net/&gt;
			&lt;threadContextInitializer/&gt;
			&lt;serviceMetadata httpGetEnabled="true" /&gt;
			&lt;serviceDebug includeExceptionDetailInFaults="true"  /&gt;
		&lt;/behavior&gt;

 

Попробуйте выполнить следующее:

1) Проверить логи windows на сервере, там должна быть более детальная информация об ошибке (это будет либо error, либо warning)

2) Если после выполнения первого пункта ситуация не прояснится, можно настроить трассировку wcf сервисов

https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/tracing-a…

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

Доброе утро, коллеги.

Есть вопрос.

Сделал тестовый вэб-сервис , по примеру из https://community.terrasoft.ru/forum/topic/9811 , но у меня что-то не сработал.
В логах результат:

При выполнении запроса возникла ошибка  статус ответа: 404 (Not Found) url запроса: [url]/0/rest/RegistrationService/TestServiceMethod метод: POST данные запроса: test data1

all-combined.js:462:345
.log() all-combined.js:462
.error() all-combined.js:462
.logResponseError() all-combined.js:722
.validateResponse() all-combined.js:723
.request/a.callback() all-combined.js:721
.callback() all-combined.js:1
.onComplete() all-combined.js:1
.onStateChange() all-combined.js:1
Ext.Function.bind/() all-combined.js:1

Код регистрационного сервиса:

namespace Terrasoft.Configuration.CommandLineService
{
  using System;
  using System.Collections.Generic;
  using System.Security;  
  using System.ServiceModel;
  using System.ServiceModel.Activation;
  using System.Web;
  using Newtonsoft.Json;
  using Terrasoft.Common;
  using Terrasoft.Web.Common;
  using Terrasoft.Configuration.RegistrationHelper;
  using Terrasoft.Core;
  using Terrasoft.Core.Configuration;
  using Terrasoft.Core.DB;
  using Terrasoft.Core.Scheduler;
  using System.CodeDom.Compiler;
  using System.ServiceModel;
  using System.ServiceModel.Web;
  using Terrasoft.Core.Entities;
  using Terrasoft.Core.Store;
  using System.Data;
  using System.Collections.Generic;

  #region Class: RegistrationService
 
  [ServiceContract]
  [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
  public class RegistrationService{

    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    public string TestServiceMethod(string data) {
      var userConnection = (UserConnection)HttpContext.Current.Session["UserConnection"];
      string key = string.Format("ExportFilterKey_{0}", Guid.NewGuid());
      userConnection.SessionData[key] = data;
      return key;
    }
  }

  #endregion
}

код запроса к нему, на клиенте:

// тест
Terrasoft.AjaxProvider.request({
  url: Terrasoft.workspaceBaseUrl + "/rest/RegistrationService/TestServiceMethod",
  headers: {
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },
  method: 'POST',
    jsonData:  'test data',
    callback: function(request, success, response) {
    if (success) {
      console.log(response.responseText);
    }
  },
  scope: this
});

Нравится

2 комментария

Мой промах, забыл опубликовать. Сделал публикацию и получил теперь:

POST [url]/0/rest/RegistrationService/TestServiceMethod 400 (Bad Request)

Здравствуйте, Евгений!

Такая ситуация связана с тем, что по умолчанию веб-сервис требует авторизции. Можно реализовать ее в клиеннтском приложении или создать сервис, доступный без авторизации. Информацию о том, как это сделать добавляю во вложение.

Также обратите внимание, что в большинстве случаев для обмена данными с системой удобнее использовать не веб сервис, а протокол Odata.

Средства интеграции bpm'online достаточно подробно описаны в документации по разработке, раздел "Примеры решения типовых задач" - "Рекомендуемые средства интеграции".

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

Добрый день Коллеги!!!
У меня возникла проблема, хотел одебажыть веб сервис таким способом но не попадает брейкпоинт при исполнении, хоть он выполняется (есть респонс)

Нравится

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

Здравствуйте.
А отладить обычные процессы на этом приложении получается?

"Репко Артём" написал:

Здравствуйте.

А отладить обычные процессы на этой приложении получается?


да

"Ильюша Сергей Николаевич" написал:
Репко Артём пишет:

Здравствуйте.

А отладить обычные процессы на этой приложении получается?

да


А breakpoint "активный" в студии?
Какой ответ от сервиса (success)?

"Бондаренко Александр Сергеевич" написал:А breakpoint "активный" в студии?
Какой ответ от сервиса (success)?

А breakpoint "активный" в студии - да активный сразу
Какой ответ от сервиса (success) - true, сервис работает хорошо и выдает все что нужно

Извеняюсь проблема была в студии, после переустановки начало отлавлевать breakpoint's

"Ильюша Сергей Николаевич" написал:

Извеняюсь проблема была в студии, после переустановки начало отлавлевать breakpoint's


Сергей, спасибо за ответ.
Если у Вас возникнут дополнительные вопросы по web-сервисам, пожалуйста, обращайтесь.

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