Вызов службы WCF из winform / ASP.net jquery ajax - PullRequest
0 голосов
/ 27 апреля 2018

Привет всем, у меня есть следующий код, который отправляет json-строку через jQuery AJAX-вызов моего кода asp.net и помещает его в имена своих классов.

JavaScript Ajax: enter image description here

ASP.net код позади: enter image description here

Код WCF: enter image description here

Код для AJAX:

$("#WCF").on("click", function () {
    var scannerSettings = {
        "FileType": "TEST1",
        "FileName": "C:\Program Files (x86)\somethibg\Sample\ScanTest\VCS 2008\bin\Debug\image#####",//$('').text(),
        "JpegQuality": "TEST2",
        "ScanContinue": false,
        "Resolution": "TEST3",
        "Rotation": "TEST4",
        "PaperSupply": "TEST5",
        "PaperSize": "TEST6",
        "Orientation": "TEST7",
        "CustomPaperWidth": 8.268,
        "CustomPaperLength": 11.693,
        "JobControl": "TEST8",
        "PunchHoleRemoval": "TEST9"
    };

    $.ajax({
        type        : "POST",
        contentType : "application/json",
        dataType    : "json",
        url         : ajaxDirPath + "WCF",
        data        : JSON.stringify({ "obj": scannerSettings }),
        cache       : false,
        success     : ServiceSucceeded,
        error       : ServiceFailed
    });
});

Код ASP.net за кодом (HomeController.cs):

[HttpPost]
[Audit(EventTypeName = "{controller}/{action} ({verb})", IncludeHeaders = true, IncludeModel = true)]
public string WCF(scannerSettings obj)
{
    Dictionary<string, string> resultsBack = new Dictionary<string, string>();
    EndpointAddress address = new EndpointAddress(new Uri(ConfigurationManager.AppSettings["EndpointAddress"].ToString()));
    NetTcpBinding binding = new NetTcpBinding();
    ChannelFactory<IService1> factory;
    IService1 SvcCall;

    binding.Security.Mode = SecurityMode.Message;
    binding.SendTimeout = new TimeSpan(0, 1, 0);
    factory = new ChannelFactory<IService1>(binding, address);
    SvcCall = factory.CreateChannel();

    string scanerData = SvcCall.Scan(obj);

    if (scanerData != null)
    {
        resultsBack.Add("dback", "GOOD");
        resultsBack.Add("img", "");
        resultsBack.Add("filename", obj.FileName);
    }

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

Код WCF:

public string Scan(scannerSettings obj)
{
    TestDelegate d = new TestDelegate(startScan);
    IAsyncResult ar = d.BeginInvoke(obj, null, null);

    string result = d.EndInvoke(ar);

    return result;

}

Как видно из приведенных выше изображений, он отправляет точные данные из AJAX-> HomeController.cs , но как только я снова отправляю их на сервер WCF, как AJAX-> HomeController.cs -> WCF он больше не имеет необходимых значений - все они null .

Класс JSON:

[DataContract]
public class scannerSettings
{
    [DataMember]
    public string FileType { get; set; }
    [DataMember]
    public string FileName { get; set; }
    [DataMember]
    public string JpegQuality { get; set; }
    [DataMember]
    public bool ScanContinue { get; set; }
    [DataMember]
    public string Resolution { get; set; }
    [DataMember]
    public string Rotation { get; set; }
    [DataMember]
    public string PaperSupply { get; set; }
    [DataMember]
    public string PaperSize { get; set; }
    [DataMember]
    public string Orientation { get; set; }
    [DataMember]
    public string CustomPaperWidth { get; set; }
    [DataMember]
    public string CustomPaperLength { get; set; }
    [DataMember]
    public string JobControl { get; set; }
    [DataMember]
    public string PunchHoleRemoval { get; set; }
}

Я подключаюсь к службе WCF локально, используя NetTcpBinding по этому адресу:

net.tcp: // локальный: 2202 / Theservice / tech6140

Кто-нибудь знает, почему это так и как это исправить?

1 Ответ

0 голосов
/ 28 апреля 2018

Служба WCF может не распознать объект запроса как scannerSettings, если пространство имен класса отличается на сервере и клиенте. Я сделал эту ошибку несколько недель назад.

На сервере у меня был объект запроса

Acme.Service.RequestObject

Когда я сгенерировал прокси службы, он включал объект запроса. Я изменил пространство имен на клиенте по эстетическим соображениям на

SomeCoolNamespace.Service.RequestObject

При вызове службы служба получит объект запроса, пространство имен которого не соответствует ожидаемому пространству имен, и параметр будет иметь значение null.

...