Hi community,
We have this situation where we need to create a bi-directional connection with our customer platform, using SOAP protocol. We would like to know if its possible to create a SOAP based services in Creatio to be accessed by our customer? If yes, any information on how to implement this?
Thanks in Advance.
Best Regards,
Pedro Pinheiro
Like
Hello Pedro,
You need to develop a configuration service (either regular or anonymous) using SOAP. Here is the article that describes how to configure web-services and integrate them into the Creatio app.
For example:
1) Create a source code for the service contract SPMSUBPServiceContract:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace SPMSUBPService { [ServiceContract] public interface IService { [OperationContract] SPMClientInfoResponse SPMClientInfo(string Login); } [DataContract] public class SPMClientInfoResponse { bool success = true; string errorText = ""; [DataMember] public bool Success { get { return success; } set { success = value; } } [DataMember] public string ErrorText { get { return errorText; } set { errorText = value; } } } }
and the source code of the SPMSUBPService service directly:
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace SPMSUBPService { public class SPMSUBPService : IService { public SPMClientInfoResponse SPMClientInfo(string Login) { return new SPMClientInfoResponse(); } } }
2) Create a file with SPMSUBPService.svc name in the Terrasoft.WebApp\ServiceModel folder with the following text:
<%@ ServiceHost Language="C#" Debug="true" Service="SPMSUBPService.SPMSUBPService" Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
3) Add the description of the service to the Terrasoft.WebApp\ServiceModel\http\services.config file:
<services> ... <service behaviorConfiguration="BaseServiceBehavior" name="SPMSUBPService.SPMSUBPService"> <endpoint name="SPMSUBPServiceEndPoint" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="SPMSUBPService.IService" /> <endpoint address="soap" binding="basicHttpBinding" contract="SPMSUBPService.IService"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> ... </services>
4) Modify the Terrasoft.WebApp\Web.config file:
... <location path="ServiceModel/SPMSUBPService.svc"> <system.web> <authorization> <allow users="*" /> </authorization> </system.web> </location> ...
And everything is ready, the service is accessible via /0/ServiceModel/SPMSUBPService.svc and the WSDL as well /0/ServiceModel/SPMSUBPService.svc?singleWsdl
Best regards,
Oscar
Oscar Dylan,
Thank you for your response.
I've tried to implement the solution you provided above and I'm getting this error when sending a request through both Postman and SoapUI.
Can you please tell me what this error means and how can I fix it?
Thanks in Advance.
Best Regards,
Pedro Pinheiro
Hi Pedro Pinheiro,
Did you got the WSDL file. For me it is showing 404 not found error if I try to access that url.
Also how can we know the what input format to pass parameters to method. Can you share those details here.
Thanks in advance.
Regards,
Manideep.
Hi Korni Manideep Reddy,
We manage to make this service working, but since it was a long time ago we don't have the specific steps to fix the error.
However, we have the updated steps that we use in order to make the service available. Maybe if you go through these following steps you could fix your problem.
Note: These steps only work for .Net Framework instances.
1. Create a new file called “DemoServiceName.svc" in ..\Terrasoft.WebApp\ServiceModel folder, and add this line:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.DemoServiceNameSpace.DemoServiceName” Factory="System.ServiceModel.Activation.ServiceHostFactory" %>
2. Add the following configuration to the ..\Terrasoft.WebApp\web.config file:
<configuration>
...
<location path="ServiceModel/DemoServiceName.svc">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
...
<appSettings>
...
<add key="AllowedLocations" value="https://yourwebsitedomain.creatio.com/0/;ServiceModel/DemoServiceName.s…" />
...
</appSettings>
...
</configuration>
3. Add the following service to the ..\Terrasoft.WebApp\ServiceModel\https\services.config file:
<service behaviorConfiguration="BaseServiceBehavior" name="Terrasoft.Configuration.DemoServiceNameSpace.DemoServiceName">
<endpoint name=“DemoServiceNameEndpoint" address="" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameRest" />
<endpoint address="soap/demoservicename” binding="basicHttpBinding" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameSoap"/>
</service>
4. Add the following service to the ..\Terrasoft.WebApp\ServiceModel\http\services.config file:
<service behaviorConfiguration="BaseServiceBehavior" name="Terrasoft.Configuration.DemoServiceNameSpace.DemoServiceName">
<endpoint name="DemoServiceNameEndpoint" address="" binding="webHttpBinding" behaviorConfiguration="RestServiceBehavior" bindingNamespace="http://Terrasoft.WebApp.ServiceModel" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameRest" />
<endpoint address="soap/demoservicename" binding="basicHttpBinding" contract="Terrasoft.Configuration.DemoServiceNameSpace.IDemoServiceNameSoap"/>
</service>
5. In the ..\Terrasoft.WebApp\ServiceModel\https\bindings.config file we need to change the basicHttpBinding to:
<basicHttpBinding>
<binding maxReceivedMessageSize="10485760">
<readerQuotas maxDepth="32" maxStringContentLength="10485760" maxArrayLength="10485760" maxBytesPerRead="10485760"/>
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
<binding name="ReportServiceBinding">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
6. In the ..\Terrasoft.WebApp\ServiceModel\http\bindings.config file we need to change the basicHttpBinding to:
<basicHttpBinding>
<binding maxReceivedMessageSize="10485760">
<readerQuotas maxDepth="32" maxStringContentLength="10485760" maxArrayLength="10485760" maxBytesPerRead="10485760"/>
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
<binding name="ReportServiceBinding" />
</basicHttpBinding>
After all of this changes are made the application needs to be restarted.
About the input format of the method, we used a CustomObject and CustomResponse which we define using the DataContract attribute.
public class DemoServiceName: IDemoServiceNameRest, IDemoServiceNameSoap { //This service needs to be anonymous. //Implement Methods here. you don't need to define WebInvoke here. } [ServiceContract] public interface IDemoServiceNameSoap { [OperationContract] CustomResponse MethodNameSoap(CustomObject cobject); } [ServiceContract] public interface IDemoServiceNameRest { [OperationContract] [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)] CustomResponse MethodNameRest(CustomObject cobject); }
Hope this helps solving your issue.
Best Regards,
Pedro Pinheiro
Hi Pedro Pinheiro,
I have tried above configuration settings But I am still not able to set soap service. I am getting 500 ServiceActivationException.
Rakshith Dheer Reddy,
What is the error description you receive when trying to access "http://localhost:83/0/ServiceModel/SoapTestService.svc" through a browser?
Best Regards,
Pedro Pinheiro
Hi Kumaran K,
Sorry, I forgot to mention that you need to add the service behavior for the metadata. This can be done with the following steps:
1. In the ..\Terrasoft.WebApp\ServiceModel\https\behaviors.config file we need to set the httpsGetEnabled to true on both behaviors:
<serviceBehaviors> ... <behavior name="BaseServiceBehavior"> ... <serviceMetadata httpsGetEnabled="true" /> ... </behavior> <behavior name="RestServiceBehavior"> ... <serviceMetadata httpsGetEnabled="true" /> ... </behavior> ... </serviceBehaviors>
2. In the ..\Terrasoft.WebApp\ServiceModel\http\behaviors.config file we need to set the httpGetEnabled to true on both behaviors:
<serviceBehaviors> ... <behavior name="BaseServiceBehavior"> ... <serviceMetadata httpGetEnabled="true" /> ... </behavior> <behavior name="RestServiceBehavior"> ... <serviceMetadata httpGetEnabled="true" /> ... </behavior> ...</serviceBehaviors>
Hope this helps.
Best Regards,
Pedro Pinheiro