Web服务不以正确的格式返回数据

时间:2015-11-04 05:53:51

标签: c# web-services servicenow

我创建了以下测试应用程序以从Service Now检索数据。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;

namespace ServiceNowConnection
{
    class Program
     {
         static void Main(string[] args)
        {
            Service_Now_Reference.getRecords records = new Service_Now_Reference.getRecords();
            records.sys_user = "XXXXXXX";

            Service_Now_Reference.ServiceNowSoapClient proxyUser = new Service_Now_Reference.ServiceNowSoapClient();
            proxyUser.ClientCredentials.UserName.UserName = "XXXXXX";
            proxyUser.ClientCredentials.UserName.Password = "XXXXXX";
            Service_Now_Reference.getRecordsResponseGetRecordsResult[] result = proxyUser.getRecords(records);

            foreach (var item in result)
            {
                Console.WriteLine(item.sys_created_by);
            }
            Console.ReadLine();
        }

    }
}

这正确地连接到服务现在应用程序没有错误,但是当我尝试打印检索到的数据时,它给我键而不是字符串类型的答案。

enter image description here

对于某些属性,它提供了正确的值(例如sys_updated_by)

enter image description here

我该如何避免这种情况。

2 个答案:

答案 0 :(得分:3)

你需要的方式。

如果您在C#中使用RESTfull API,可以立即通过向服务发送直接HTTPS调用来实现。

但是当你使用SOAP api时,事情变得复杂了

当您将Web服务导入到您的程序时,它会将以下XML代码包含到App.config或Web.config中,具体取决于您的应用程序意图(Web应用程序或独立应用程序)。

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="ServiceNowSoap">
      <security mode="Transport" />
    </binding>
    <binding name="ServiceNowSoap1" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="https://XXXXXXXX.service-now.com/service_subscribe_sys_user_list.do?SOAP"
    binding="basicHttpBinding" bindingConfiguration="ServiceNowSoap"
    contract="ServiceReference1.ServiceNowSoap" name="ServiceNowSoap" />
</client>
 </system.serviceModel>

首先,如果您希望检索大量记录,则需要增加Max Received Message Size的大小。

为此您需要编辑标签,如下所示

<binding name="ServiceNowSoap" maxReceivedMessageSize="2000000000">

下一部分是在URL中添加displayvalue = all。

我们无法使用自己的XML编辑端点网址,而是可以删除网址并将其添加为关键值。但是你仍然无法通过&amp;添加参数到网址签名您需要将值存储为单独的键并将其与程序结合以获取完整的URL

最终的XML将是这样的

<configuration>
  <appSettings>
    <add key="serviceNowUrl"
     value="https://XXXXXXXX.service-now.com/service_subscribe_sys_user_list.do?"/>
    <add key="displayvalue" value="displayvalue=true"/>
    <add key="protocol" value="SOAP"/>
  </appSettings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="ServiceNowSoap" maxReceivedMessageSize="2000000000">
                    <security mode="Transport">
                        <transport clientCredentialType="Basic" proxyCredentialType="Basic"
                        realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
                <binding name="ServiceNowSoap1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint binding="basicHttpBinding" bindingConfiguration="ServiceNowSoap"
            contract="Service_Now_Reference.ServiceNowSoap" name="ServiceNowSoap" />
        </client>
    </system.serviceModel>
</configuration>

您可以按以下方式汇编网址

    string url = ConfigurationSettings.AppSettings["serviceNowUrl"];
    string protocol = ConfigurationSettings.AppSettings["protocol"];
    string displayvalue = ConfigurationSettings.AppSettings["displayvalue"];

    System.ServiceModel.EndpointAddress endpoint = new System.ServiceModel.EndpointAddress(string.Format("{0}{1}{2}", url, protocol, displayvalue));

答案 1 :(得分:1)

如果您更新用​​于获取WSDL并向其发出请求的URL,则包括&quot; displayvalue = all&#39;响应将包括显示名称以及引用记录的sys_id值(想想foreign_key)。

有关详细信息,请查看:http://wiki.servicenow.com/?title=Direct_Web_Services#Return_Display_Value_for_Reference_Variables&gsc.tab=0

谢谢, 布赖恩