尽管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>