WCF Web服务反序列化操作的请求消息正文时发生错误

时间:2019-04-19 09:46:31

标签: c# web-services wcf xamarin.forms azure-app-service-envrmnt

这个问题来自this other question。除了由于FirstMethodLastMethod方法引起问题(我在同一个问题中对此进行了评论)而删除了这些方法之外,这些代码基本相同。

即使如此,我也会在此处复制服务接口以供参考。如果你们中的某些人觉得也有必要在这里复制完整的代码,我没问题,我将在这里复制。

服务合同界面

[ServiceContract]
public interface IMJRFFrasCdadesService
{
    [OperationContract]
    string Ping();

    [OperationContract]
    Task<string> GoogleLoginAsync(string email);

    [OperationContract]
    Task<string> UploadFileAsync(byte[] fileBytes, string fileName, string email);
}

好吧,现在当我连接到服务时,它会抛出此错误:

            Error: 
Error in deserializing body of request message for operation 'GoogleLogin'. OperationFormatter encountered an invalid Message body. Expected to find node type 'Element' with name 'GoogleLogin' and namespace 'http://tempuri.org/'. Found node type 'Element' with name 'GoogleLoginAsync' and namespace 'http://tempuri.org/' ;

            Trace: 
at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_remoting_wrapper(intptr,intptr)
at (wrapper remoting-invoke) ServiceReference2.IMJRFFrasCdadesService.GoogleLoginAsync(string)
at ServiceReference2.MJRFFrasCdadesServiceClient.GoogleLoginAsync (System.String email) [0x00006] in <e1f3df4dfbf340f09d2768d7fbc33427>:0 
at MJRFFacturasComunidades.Model.WebService.WebServiceClass+<LogEmail>d__6.MoveNext () [0x00023] in <e1f3df4dfbf340f09d2768d7fbc33427>:0  ;

请纠正我,如果我错了,但是我知道客户端正在尝试调用名为GoogleLogin的方法,但是该方法名为GoogleLoginAsync(如代码中所示) ),因此找不到该方法。显然。

但是,VStudio使用WCF Web Service Reference Provider自动生成了客户端代码...我该怎么办?我不明白。

无论如何,我试图查看客户端生成的代码(由于我是WCF的新手,我将重复一下),并看到以下内容:

[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.0.1")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.IMJRFFrasCdadesService")]
public interface IMJRFFrasCdadesService
{

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMJRFFrasCdadesService/Ping", ReplyAction="http://tempuri.org/IMJRFFrasCdadesService/PingResponse")]
    System.Threading.Tasks.Task<string> PingAsync();

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMJRFFrasCdadesService/GoogleLogin", ReplyAction="http://tempuri.org/IMJRFFrasCdadesService/GoogleLoginResponse")]
    System.Threading.Tasks.Task<string> GoogleLoginAsync(string email);

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMJRFFrasCdadesService/UploadFile", ReplyAction="http://tempuri.org/IMJRFFrasCdadesService/UploadFileResponse")]
    System.Threading.Tasks.Task<string> UploadFileAsync(byte[] fileBytes, string fileName, string email);
}

我想Action的{​​{1}}参数定义了将在服务处调用的方法(再次,请纠正我,如果我错了,请),所以我改变了测试它,结果如下:

OperationContractAttribute

所以,不,我错了:(

是的,我只能说,我不知道为什么会这样。老实说,我认为“引用提供程序”会生成对服务方法的调用,就像在服务接口中一样,但是,我想我不明白...

无论如何,我现在不知道该怎么办。再次任何帮助。


编辑:

好吧,我无法处理我在评论中写的 Error: The message with Action 'http://tempuri.org/IMJRFFrasCdadesService/GoogleLoginAsync' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None). ; Trace: at (wrapper managed-to-native) System.Object.__icall_wrapper_mono_remoting_wrapper(intptr,intptr) at (wrapper remoting-invoke) ServiceReference1.IMJRFFrasCdadesService.GoogleLoginAsync(string) at ServiceReference1.MJRFFrasCdadesServiceClient.GoogleLoginAsync (System.String email) [0x00006] in <7e18c3beb694450a8a87883f2950def0>:0 at MJRFFacturasComunidades.Model.WebService.WebServiceClass+<LogEmail>d__6.MoveNext () [0x00023] in <7e18c3beb694450a8a87883f2950def0>:0 ; 问题的工作方法,因此,如@mahlatse所建议,这是Web服务中的服务合同:

Xamarin.Forms

[ServiceContract] public interface IMJRFFrasCdadesService { [OperationContract] string Ping(); [OperationContract] Task<string> GoogleLoginAsync(string email); [OperationContract] Task<string> UploadFileAsync(byte[] fileBytes, string fileName, string email); } 客户端中,由我修改的自动生成的界面:

Xamarin.Forms

如您所见,我也修改了[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.0.1")] [System.ServiceModel.ServiceContractAttribute(ConfigurationName= "ServiceReference1.IMJRFFrasCdadesService")] public interface IMJRFFrasCdadesService { [System.ServiceModel.OperationContractAttribute(Action=@"http://tempuri.org/IMJRFFrasCdadesService/Ping", ReplyAction=@"http://tempuri.org/IMJRFFrasCdadesService/PingResponse")] System.Threading.Tasks.Task<string> PingAsync(); [System.ServiceModel.OperationContractAttribute(Action=@"http://tempuri.org/IMJRFFrasCdadesService/GoogleLoginAsync", ReplyAction= @"http://tempuri.org/IMJRFFrasCdadesService/GoogleLoginAsyncResponse")] System.Threading.Tasks.Task<string> GoogleLoginAsync(string email); [System.ServiceModel.OperationContractAttribute(Action=@"http://tempuri.org/IMJRFFrasCdadesService/UploadFileAsync", ReplyAction= @"http://tempuri.org/IMJRFFrasCdadesService/UploadFileAsyncResponse")] System.Threading.Tasks.Task<string> UploadFileAsync(byte[] fileBytes, string fileName, string email); } 参数,并添加了@只是为了避免“转义字符问题”。但是完全没有变化。

在阅读@tgolisch注释后,我修改了ReplyAction文件,并发现绑定为web.config。我修改了客户端,并在创建服务客户端类时将绑定设置为https,所以我将其更改为:

http

我还从自动生成的服务客户端类中更改了此方法,因为当参数引用private IMJRFFrasCdadesService _Service; public WebServiceClass(string url) { _ServiceUrl = url; _Service = new MJRFFrasCdadesServiceClient( new BasicHttpsBinding(), new EndpointAddress(_ServiceUrl)); } 时它正在创建http绑定(在第二个https使用if而不是System.ServiceModel.BasicHttpBinding版本):

https

毕竟,我仍然得到相同的结果。

老实说,我开始问自己,让VStudio自动生成充满错误的代码有什么意义。

即使有所有这些,我也没有放弃我在评论中指出的xamarin问题。

1 个答案:

答案 0 :(得分:0)

我放弃了。我刚刚制作了一个ASP.Net核心Web API。

使用WCF Web服务,我在阅读,学习和使用它之间花费了一个多星期的时间:从未按预期工作。

我使用网络api花了半天时间阅读和学习(大部分时间是this video at youtube's visual studio channel。我一直很讨厌MSDN文章解释问题的方式,但是这段视频确实可以节省时间),并且一天零一个早晨使它工作,包括Xamarin.Forms客户端,而这些客户端以前对HTTP或ASP.Net的了解很少。

现在一切正常。感谢您的帮助:)