1

我正在使用 SoapUI 测试使用 ServiceStack 创建的 api,当我尝试通过标头发送所需的 DataMember 时,api 返回正确的值。当我尝试通过 Body 发送所需的 DataMember 时,出现以下错误...请帮助

通过正文发送的请求

<GetProductDetailsReq>
<AToken>ck0b0YYBPkrnVF/j6e16DUPzxLX2SMCXewoR4T</AToken>
</GetProductDetailsReq>

POST http://localhost/ServiceStackAPI/GetProductDetails HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/xml
Accept: application/xml
Content-Length: 777
Host: localhost
Proxy-Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

响应状态

错误代码 SerializationException 消息无法使用 ServiceModel.DTO.GetProductDetailsReq 反序列化“应用程序/xml”请求错误:System.Runtime.Serialization.SerializationException:第 1 行位置 66 中的错误。来自命名空间“..遇到”的预期元素“GetProductDetailsReq”名称为“GetProductDetailsReq”、命名空间“ http://schemas.servicestack.net/types ”的元素'。在 System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) 在 System.Runtime.Serialization.XmlObjectS (XmlDictionaryReader 阅读器)在 System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream 流) 在 ServiceStack.WebHost.Endpoints.Support.EndpointHandlerBase.CreateContentTypeRequest(IHttpRequest httpReq, Type requestType, String contentType) 在 ServiceStack.WebHost.Endpoints.Support.EndpointHandlerBase 的堆栈跟踪。

4

1 回答 1

0

检查SOAP 限制以确保您正在创建可以在 SOAP 中发送的服务,即如果调用了请求 DTO,GetProductDetails那么它必须返回一个名为 的响应 DTO GetProductDetailsResponse。此外,您需要确保您的 DTO 具有[DataContract]所有类型和[DataMember]所有公共属性,并且您的 DTO 位于单个命名空间中。

此请求的另一个问题是您使用 SOAP 请求到错误的端点地址。即 SOAP 端点是/soap11/soap12。在上面的示例中,它尝试将其发送到/GetProductDetails自定义 HTTP 路由,而对于 SOAP,它需要是/soap11soap12

如果您只是想通过 HTTP 发送 XML,那么您应该只发送原始 XML 有效负载,您可以通过序列化请求 DTO 来了解它的外观,例如:

string requestXml = new GetProductDetails { ... }.ToXml();

您可以使用HTTP Utils轻松发送:

var responseXml = "http://localhost/ServiceStackAPI/GetProductDetails"
    .PostXmlToUrl(xmlRequest);

var responseDto = responseXml.FromXml<GetProductDetailsResponse>();

假设您在Request DTO[Route("/GetProductDetails")]上定义了一个。GetProductDetails

于 2015-06-24T15:56:50.043 回答