Вызов локальной службы WCF из ASP.net AJAX - PullRequest
0 голосов
/ 26 апреля 2018

Я использую следующий код на локальном компьютере, чтобы предоставить мне временную службу WCF:

using System;
using System.Windows.Forms;
using System.ServiceModel;
using TestService;

namespace TestClient
{
    public partial class Form1 : Form
    {
        IService1 patientSvc = null;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            EndpointAddress address = new EndpointAddress(new Uri("net.tcp://localhost:2202/PatientService"));
            NetTcpBinding binding = new NetTcpBinding();
            ChannelFactory<IService1> factory = new ChannelFactory<IService1>(binding, address);
            patientSvc = factory.CreateChannel();
        }
    }
}

А, класс1:

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.Runtime.Serialization;

namespace TestService
{
    [ServiceContract()]
    public interface IService1
    {
        [OperationContract]
        Patient GetPatient(Int32 index);

        [OperationContract]
        void SetPatient(Int32 index, Patient patient);
    }

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class PatientService : IService1
    {
        Patient[] pat = null;

        public PatientService()
        {
            pat = new Patient[3];

            pat[0] = new Patient();
            pat[0].FirstName = "Bob";
            pat[0].LastName = "Chandler";

            pat[1] = new Patient();
            pat[1].FirstName = "Joe";
            pat[1].LastName = "Klink";

            pat[2] = new Patient();
            pat[2].FirstName = "Sally";
            pat[2].LastName = "Wilson";
        }

        public Patient GetPatient(Int32 index)
        {
            if (index <= pat.GetUpperBound(0) && index > -1)
                return pat[index];
            else
                return new Patient();
        }

        public void SetPatient(Int32 index, Patient patient)
        {
            if (index <= pat.GetUpperBound(0) && index > -1)
                pat[index] = patient;
        }
    }

    [DataContract]
    public class Patient
    {
        string firstName;
        string lastName;

        [DataMember]
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }

        [DataMember]
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }
}

Это прекрасно работает, если мне позвонили на PatientService с "1". Он показывает мне значения Джо и Клинк .

Однако, сделайте то же самое на странице моего сайта ASP.net со следующим:

.cs страница:

@{
    ViewBag.Title = ViewBag.Message;
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="col-sm-offset-2 col-sm-8" style="margin-bottom: 10px; margin-top: 10px; text-align: center;">
    <Button class="tips btn btn-success btn-outline" style="margin-right: 10px;" id="WCF" data-tooltip="@Html.Raw(tips["Continue"])">WCF TEST</Button>
</div>

И JavaScript:

$(document).ready(function () {    
    $("#WCF").on("click", function () {
        $.ajax({
            type: "POST",
            url: ajaxDirPath + "WCF",
            data: '{"patNum": "1"}',
            contentType: "application/json", // content type sent to server
            success: ServiceSucceeded,
            error: ServiceFailed
        });
    });
});

function ServiceFailed(result) {
    console.log('Service call failed: ' + result.status + '  ' + result.statusText);
}

function ServiceSucceeded(result) {
    resultObject = result.MyFunctionResult;
    console.log("Success: " + resultObject);
}

И код позади:

[HttpPost]
public string WCF(string patNum)
{
    Dictionary<string, string> resultsBack = new Dictionary<string, string>();
    EndpointAddress address = new EndpointAddress(new Uri("net.tcp://localhost:2202/PatientService"));
    NetTcpBinding binding = new NetTcpBinding();
    ChannelFactory<IService1> factory = new ChannelFactory<IService1>(binding, address);
    IService1 patientSvc = factory.CreateChannel();

    Patient patient = patientSvc.GetPatient(Convert.ToInt32(patNum));

    if (patient != null)
    {
        resultsBack.Add("dback", "GOOD");
        resultsBack.Add("return1", patient.FirstName);
        resultsBack.Add("return2", patient.LastName);
    }

    return JsonConvert.SerializeObject(resultsBack, Formatting.Indented);
}

Переменная Patient равна NULL для всего, что возвращается.

Что бы я делал неправильно?

UPDATE Это шаги в отладке как из JavaScript, так и из службы WCF:

enter image description here

Далее ->

enter image description here

Далее ->

enter image description here

Далее ->

enter image description here

Далее ->

enter image description here

Далее ->

enter image description here

...