SOAP WEB SERVICES IN .NET CORE

آشنایی با AutoDelete – Exclusive – Durable
Test Driven-Development-(TDD)

Table of Contents

در اینجا توضیحاتی در مورد SOAP (Simple Object Access Protocol) و نحوه تولید کد C# از یک فایل WSDL در یک پروژه .NET Core ارائه می‌دهیم. همچنین مشکلات متداولی که گاهی پس از ایجاد این کدها بوجود می‌آید را بررسی می‌کنیم.

مفاهیم اصلی:

1. **SOAP (Simple Object Access Protocol)**:
– یک پروتکل پیام‌رسانی برای تبادل اطلاعات ساختار یافته در اجرای سرویس‌های وب است.
– از XML به عنوان قالب پیام خود استفاده می‌کند.
– پروتکل‌های لایه برنامه‌ای مختلفی مانند HTTP(s) را می‌پذیرد.

2. **WSDL (Web Service Description Language)**:
– یک زبان توصیف سرویس برای توصیف عملکرد سرویس‌های وب مبتنی بر SOAP است.
– فایل‌های WSDL برای تست سرویس‌های مبتنی بر SOAP لازم هستند.

3. **WCF (Windows Communication Foundation)**:
– یک چارچوب برنامه‌نویسی برای ساخت برنامه‌های مبتنی بر سرویس (SOA) است.
– با WCF می‌توان داده‌ها را به صورت پیام‌های Async از یک EndPoint سرویس به EndPoint دیگر ارسال کرد.

4. **.NET Core**:- یک چارچوب توسعه وب برای ساخت برنامه‌های وب بر روی پلتفرم .NET است.
– Open Source است و توسط مایکروسافت Support می‌شود.

اضافه کردن سرویس به پروژه

از سرویس زیر به عنوان سوریس تستی استفاده نمایید :

HTTP://WWW.DNEONLINE.COM/CALCULATOR.ASMX?WSDL

1. **نصب Microsoft WCF Web Services Reference Provider در Visual Studio**:
– ابزار WCF Web Service Reference Provider باید در Visual Studio نصب شود.

2. **ایجاد پروژه .NET Core WEB API**:
– ایجاد یک پروژه ASP.NET Core Web API.

3. **تولید reference code از یک فایل WSDL**:
– تولید کد C# از یک فایل WSDL با استفاده از Microsoft WCF Web Services Reference Provider.

کد نویسی  

4. **استفاده از Connected Service**:
– استفاده از Connected Service برای استفاده از کد تولید شده از وب سرویس.

				
					using CalcReference;
using Microsoft.AspNetCore.Mvc;
using ServiceReference1;

namespace SoapSample.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class AddController : ControllerBase
    {
        [HttpGet]
        public async Task<IActionResult> Get(int a , int b)
        {
           
            CalculatorSoapClient client = new CalculatorSoapClient(CalculatorSoapClient.EndpointConfiguration.CalculatorSoap);

            await client.OpenAsync();

            var sum = await client.AddAsync(a, b);
            await client.CloseAsync();

            return this.Ok(sum);
        }
    }
}


				
			

5. **مشکلات ممکن**:

Sometimes errors can occur that are difficult to pinpoint, so here are some of them:

  1. Each child element has its own declaration of namespaces, instead of inheriting from parent or root node

Some web services don’t allow each element in the payload to have its own namespaces, instead, inheriting from its parent.

 

<test:Parent xmlns:test=”http://myschema.org”>

 <test:Child1 xmlns:test=”http://myschema.org”>Test1</test:Child1>

 <test:Child2 xmlns:test=”http://myschema.org”>20</test:Child2>

</test:Parent>

 

 

To resolve this, we must declare that the parent is a wrapper element and a root node:

[System.ServiceModel.MessageContractAttribute(IsWrapped=true, WrapperName = “Parent”, WrapperNamespace = “http://myschema.org”)][System.Xml.Serialization.XmlRoot(Namespace = “http://myschema.org”)]public partial class ParentWrapper {}

 

And so, the XML will be serialized:

<test:Parent xmlns:test=”http://myschema.org”> <test:Child1>Test1</test:Child1> <test:Child2>20</test:Child2></test:Parent>

 

 

  1. Elements have xsi:nil=”true” attributes

Sometimes web services do not allow to mark null values as xsi:nil=”true”, so instead we should remove these elements by removing the “IsNullable=true” attribute from the XmlElement declaration in the generated code. Instead of this:

[System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] 

It should read:

[System.Xml.Serialization.XmlElementAttribute()]