ajax post 请求 wcf,使用POST POST AJAX请求WCF服务

在尝试使用AJAX进行POST请求到WCF服务时遇到了504错误,错误信息显示服务器没有返回完整响应。问题出现在`WebInvoke`方法属性和全局配置上。通过移除`Method=OPTIONS`属性并调整Global.asax中的响应头设置,解决了跨域请求的部分问题。然而,现在在Fiddler中看到新的错误:ReadResponse()失败,服务器没有为请求返回完整响应。代码和配置已经进行了多次修改,但WcfTestClient调试仍不工作,无法加载服务方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AJAX请求WCF使用方法POST时出现此错误?使用POST POST AJAX请求WCF服务

HTTP/1.1 504提琴手 - 接收失败 日期:2016年12月3日星期六20:38:19 GMT Content-Type:text/html;字符集= UTF-8 连接:关闭 缓存控制:无缓存,必须-重新验证 时间戳:18:38:19.757

[提琴手] ReadResponse()失败:服务器未返回一个完整的响应这个请求。服务器返回0字节。

我越来越与来了在同一请求选项和POST方法的几个误区。

这里是我的代码:

合同

[OperationContract]

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]

DadosPF ConsultaMaisPessoaFisica(string login, string token, string cpf);

方法实现

public DadosPF ConsultaMaisPessoaFisica(string login, string token, string cpf)

{

DadosPF info = new DadosPF();

try

{

using (MailingData data = new MailingData())

{

if (!ValidarToken(login, token))

{

info.Erro = "Token inválido";

return info;

}

if (!data.ValidarAcessoServico(login, WebService.MaisPessoaFisica))

{

info.Erro = "Serviço não esta ativo para este login";

return info;

}

if (!data.ValidarConsumoServico(login, WebService.MaisPessoaFisica))

{

info.Erro = "Limite máximo de consumo excedido";

return info;

}

cpf = BaseData.OnlyNumbers(cpf);

var dadosCadastrais = data.ConsultaCadastroPF(cpf).FirstOrDefault();

if (dadosCadastrais == null)

{

info.Erro = "Nenhum registro encontrado";

return info;

}

else

{

info = new DadosPF();

info.DadosCadastrais = dadosCadastrais;

info.Enderecos = data.ConsultarEnderecosPF(dadosCadastrais.cod_pessoa_fisica);

info.Contatos = data.ConsultarContatosPF(dadosCadastrais.cod_pessoa_fisica);

info.Parentesco = data.ConsultarParentescoPF(dadosCadastrais.cod_pessoa_fisica);

info.Veiculos = data.ConsultaVeiculos(dadosCadastrais.cod_pessoa_fisica, 0);

info.Empresas = data.ConsultarEmpresasPorSocio(cpf);

data.AtualizarConsumo(login, WebService.MaisPessoaFisica);

}

}

}

catch (Exception ex)

{

Log.Logger.Error(ex.Message, ex);

throw new Exception("Falha no metodo ConsultaMaisPessoaFisica: " + ex.ToString());

}

return info;

}

的Global.asax

protected void Application_BeginRequest(object sender, EventArgs e)

{

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

if (HttpContext.Current.Request.HttpMethod == "OPTIONS")

{

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Authorization, Origin, Content-Type, Accept, X-Requested-With");

HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");

HttpContext.Current.Response.End();

}

}

WEB.CONFIG

multipleSiteBindingsEnabled="true" />

maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />

name="MailingService_Endpoint" contract="WcfVisualFix.IMailingService" />

binding="webHttpBinding" contract="WcfVisualFix.ISiteService" />

AJAX调用

$("#btnConsultar").click(function() {

$.ajax({

url: "http://localhost:70/SiteService.svc/ConsultaMaisPessoaFisica",

type: "POST",

contentType: 'application/json;charset=utf-8',

data: JSON.stringify({ login: $("#txtLogin").val(), token: $("#txtToken").val(), cpf: $("#txtCPF").val() }),

dataType: "json",

success:

function (res) {

$("#txtNome").val(res.d.Nome);

},

error:

function (err) {

console.log(err);

}

});

+0

你得到了什么错误信息?你是否尝试先使用类似邮递员的东西来查看你的API是否在工作?你有没有尝试调试任何东西? –

+0

@AndreiDragotoniu我在提问上得到了错误,编辑了问题。我必须对我的代码进行很多修改才能修复先前的错误,原因是我必须删除Method属性“WebInvoke(Method =”OPTIONS“)]”“。我认为这是一种“解决方法”解决方案,可以使它适用于POST。其次,我从WebConfig中删除了自定义头,因为我是在global.asax“BeginRequest”事件上做的。但是现在,我在fiddler上得到这个错误:ReadResponse()失败:服务器没有为这个请求返回完整的响应。服务器返回0字节。 –

+0

我无法修复的其他问题是WcfTestClient上的debbugin无法正常工作。它不会从元数据中加载服务方法。 –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值