【问题标题】:Calling WCF service from winform/ASP.net jquery ajax从 winform/ASP.net jquery ajax 调用 WCF 服务
【发布时间】:2018-04-27 18:53:50
【问题描述】:

大家好,我有以下代码,它通过 jQuery AJAX 调用将 json 字符串发送到我的 asp.net 代码后面,并将其放入它们的类名中。

JavaScript Ajax:

ASP.net 后面的代码:

WCF 代码:

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; }
}

我通过这个地址使用 NetTcpBinding 在本地连接到 WCF 服务:

net.tcp://localhost:2202/theService/tech6140

有人知道这是为什么以及如何解决吗?

【问题讨论】:

  • 我曾经遇到过这个问题,当被传输的对象的命名空间在服务器和客户端之间是不同的,所以完全限定的类型名称不匹配并且WCF服务无法识别它。
  • @DanWilson 你能举例说明你在说什么吗?
  • 服务器将scannerSettings 视为Org.Code.scannerSettings,而客户端将其视为ServiceProxy.scannerSettings。我假设客户端使用scannerSettings 作为生成的代理类的一部分。
  • @DanWilson 举个例子会更好。
  • 我不知道您从哪里获得 Org.Code.scannerSettingsServiceProxy.scannerSettings

标签: c# ajax asp.net-mvc wcf nettcpbinding


【解决方案1】:

如果服务器和客户端上类的命名空间不同,WCF 服务可能无法将请求对象识别为scannerSettings。几周前我犯了这个错误。

在服务器上,我有请求对象

Acme.Service.RequestObject

当我生成服务代理时,它包含了请求对象。出于美学原因,我将客户端上的命名空间更改为

SomeCoolNamespace.Service.RequestObject

调用服务时,服务会收到一个命名空间与预期命名空间不匹配的请求对象,参数为null。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2014-07-08
    • 2015-12-31
    • 2014-08-18
    相关资源
    最近更新 更多