2015-11-04 2 views
3

Я создал следующее тестовое приложение для извлечения данных из 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

как можно избежать этой ситуации.

+0

Hi Sandaru, Можете ли вы предоставить более подробную информацию? В частности, URL-адрес вы делаете запросы? Как выглядит HTTP-запрос? Вы создали ServiceNowSoapClient из WSDL? – Bryan

+0

yah im using WSDL. URL-адрес: https://XXXXXXXX.service-now.com/service_subscribe_sys_user_list.do?WSDL – Sandaru

+1

Спасибо, все еще можно использовать больше информации, чтобы сказать наверняка, но я предполагаю, что обновление URL-адреса вы вытаскиваете WSDL, чтобы включить 'displayvalue = all' (см.: Http://wiki.servicenow.com/?title= Direct_Web_Services # Return_Display_Value_for_Reference_Variables) поможет. Это также поможет, если вы сможете захватить образец HTTP-запроса, отправляемого вашим приложением C#, и включить его в вопрос здесь. Если вы делаете это, убедитесь, что вы удаляете все учетные данные в заголовках. – Bryan

ответ

1

Если вы обновляете URL-адрес, используемый для получения WSDL и отправляете запросы, для включения «displayvalue = all» ответ будет включать в себя отображаемые имена, а также значения sys_id (think foreign_key) ссылочных записей.

Для получения дополнительной информации ознакомьтесь с: http://wiki.servicenow.com/?title=Direct_Web_Services#Return_Display_Value_for_Reference_Variables&gsc.tab=0

Спасибо, Брайан

3

, как вы должны это сделать.

Если вы используете RESTfull API в C#, вы можете сделать это, отправив прямой вызов HTTPS на обслуживание сейчас.

Но все усложняется, когда вы используете SOAP API

Пока вы импортирование веб-сервис для вашей программы он включает в себя следующие XML-коду к App.config или Web.config в зависимости от вашего намерения приложения (веб-приложение или отдельное приложение).

<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 Полученное сообщение Размер.

для этого вам нужно отредактировать тег как следующий

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

Следующая часть добавляет displayvalue = все в URL.

Мы не можем редактировать URL-адрес конечной точки, используя XML-файл, вместо этого вы можете удалить URL-адрес и добавить его в качестве ключевого значения. Но все-таки вы не можете добавить параметры в 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> 

Вы можете соберите url следующим образом:

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));