尽管REST API返回正确的数据,但从REST API到ChannelFactory客户端的c#响应为空
我当前在从尽管REST API返回正确的数据,但从REST API到ChannelFactory客户端的c#响应为空,c#,json,rest,api,channelfactory,C#,Json,Rest,Api,Channelfactory,我当前在从restapi获取数据时遇到问题。REST API在浏览器中显示正确的结果,客户端成功连接到API以请求数据(调试和单步执行显示所有工作正常),但无论我做什么,客户端都会说响应为null(或抛出各种错误) 出于测试目的,我制作了一个非常简单的函数Bob,它只返回您发送的任何内容,但获取数据的实际函数的功能完全相同 restapi控制器 namespace SiteServicesAPI.Controllers { public class SiteServicesControl
restapi
获取数据时遇到问题。REST API在浏览器中显示正确的结果,客户端成功连接到API以请求数据(调试和单步执行显示所有工作正常),但无论我做什么,客户端都会说响应为null(或抛出各种错误)
出于测试目的,我制作了一个非常简单的函数Bob,它只返回您发送的任何内容,但获取数据的实际函数的功能完全相同
restapi控制器
namespace SiteServicesAPI.Controllers
{
public class SiteServicesController : Controller
{
private readonly SiteServices _siteService;
public SiteServicesController()
{
_siteService = new SiteServices();
}
public string Bob(string Bob)
{
return _siteService.Bob(Bob);
}
}
}
RESTAPI SiteServices函数调用
namespace SiteServicesRole
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class SiteServices : ISiteServicesContract
{
public SiteServices()
{
}
public string Bob(string Bob)
{
return Bob;
}
}
}
REST API web.config system.serviceModel
<system.serviceModel>
<services>
<service name="SiteServicesRole.SiteServices" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="webHttpBinding" contract="SiteServicesContracts.ISiteServicesContract" behaviorConfiguration="web">
</endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
客户端代理设置和对RESTAPI的调用
namespace SiteServicesContracts
{
[ServiceContract]
public interface ISiteServicesContract
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "Bob", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
string Bob(string Bob);
}
}
namespace SiteServices
{
public class SiteServicesClient : ISiteMessages, ISiteSettings
{
private readonly string _endpoint;
public SiteServicesClient(string endpoint)
{
_endpoint = endpoint;
}
private ISiteServicesContract GetProxy()
{
var channel = new ChannelFactory<ISiteServicesContract>(new WebHttpBinding(), _endpoint);
channel.Endpoint.Behaviors.Add(new WebHttpBehavior());
return channel.CreateChannel();
}
public SiteSettings GetSiteSettings(string siteIdent, string publicKey)
{
var proxy = GetProxy();
SiteSettings siteSettings;
try
{
var Bob = proxy.Bob("Bob");
}
catch (Exception ex)
{
return null;
}
return siteSettings;
}
}
}
这不会引发任何错误,但客户端中var Bob中的返回值为null
今天,它给了我一个XML错误,尽管它设置为使用Json:-
从网络接收的XML有问题。有关详细信息,请参阅内部异常
内部异常:意外的文件结尾
因此我耸耸肩,将其设置为返回一个简单的XML字符串:-
<Bob>Bob</Bob>
Bob
这给了我一个错误:-
OperationFormatter遇到无效的消息正文。应找到名为“BobResponse”的节点类型“Element”
这让我很兴奋,我在正确的球场上,所以我把元素从Bob改为BobreResponse:-
<BobResponse>Bob</BobResponse>
Bob
这给了我一个错误:-
OperationFormatter遇到无效的消息正文。期望
查找名为“BobResponse”和命名空间的节点类型“Element”
''. 找到名为的节点类型“Element”
“BobResponse”和命名空间“”
好的,我添加了名称空间:-
<BobResponse xmlns="http://tempuri.org/">Bob</BobResponse>
Bob
新错误:-
反序列化操作“Bob”的回复消息正文时出错。终点
应为命名空间“”中的元素“BobResponse”。
找到文本“Bob”。第1行,位置45
因此我尝试将响应嵌入到另一个元素中:-
<BobResponse xmlns="http://tempuri.org/"><Bob>Bob</Bob></BobResponse>
Bob
这不再抛出错误,但我回到了客户机中设置为null的var Bob
有人能告诉我成功地将数据返回到客户端的正确方向吗(最好是Json而不是XML)
谢谢 这有点超出范围,所以我将其作为评论。我认为使用wcf处理rest是一个糟糕的想法。REST被认为是轻量级的,而wcf是一个沉重的堆栈。基本上,让事情正常运转总是很困难的。由于您同时控制服务器和客户机,而且您的服务器似乎构建在WebApi之上,因此我强烈建议您切换到OpenAPI/Swagger和轻量级客户机生成器。检查Swashback、NSwag、Autorest库。这有点超出范围,所以我将其作为注释。我认为使用wcf处理rest是一个糟糕的想法。REST被认为是轻量级的,而wcf是一个沉重的堆栈。基本上,让事情正常运转总是很困难的。由于您同时控制服务器和客户机,而且您的服务器似乎构建在WebApi之上,因此我强烈建议您切换到OpenAPI/Swagger和轻量级客户机生成器。检查Swashback、NSwag、自动测试库。
<BobResponse xmlns="http://tempuri.org/"><Bob>Bob</Bob></BobResponse>