Служба REST, возвращающая объект, прерывает - PullRequest
1 голос
/ 03 апреля 2012

Я пытаюсь реализовать службу REST в своем приложении C # для связи с клиентом Android. Я борюсь с C # часть.

Я следил за этой статьей: http://msdn.microsoft.com/en-us/library/bb412178

Вот так я запускаю свой сервис:

WebServiceHost host = new WebServiceHost(typeof(RestService), new Uri("http://localhost:8000/"));
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IRestService), new WebHttpBinding(), "");
host.Open();

Очень похоже на статью, приведенную выше, у меня есть интерфейс IRestService и RestService с методами EchoWithGet (string s) и EchoWithPost , которые я не использую, и я не буду больше говорить об этом. Я хочу вернуть класс UserClientInfo, который является причиной проблемы, которую я опишу позже.

[ServiceContract]
interface IRestService
{
    [OperationContract]
    [WebGet]
    UserClientInfo EchoWithGet(string s);
}

Вот реализация EchoWithGet (...). Он подключается к другой службе и вызывает UserLog, который должен вернуть UserClientInfo .

public UserClientInfo EchoWithGet(string s)
{
    service = (IService)Activator.GetObject(typeof(IService), "tcp://127.0.0.1:7878/" + "Service");
    service.UserLog("username", "password", out uci);
    return uci;
}

UserClientInfo - довольно сложный объект. Я не уверен, смогу ли я вернуть его службой. Это структура, содержащая другие структуры внутри, которая содержит другие структуры.

[Serializable]
public struct UserClientInfo
{
    public ulong ClientId;
    public DatabaseManager DBManager;
    public string DisplayedName;
    public ChISDispositions Dispositions;
    public RegistrationInfo RegistrationInfo;
    public uint Right1;
    public uint Right2;
    public uint Right3;
    public uint Right4;
    public string SessionId;
    public string UserId;
}

Когда я запускаю службу и указываю браузеру на http://localhost:8000/EchoWithGet?s=teststring, я получаю сообщение об ошибке подключения. Firebug показывает статус Aborted на вкладке сети. Сервис как-то вылетает. Я могу отладить его и увидеть, что UserLog () хорошо восстанавливает объект uci, и сервис возвращает его, но где-то между браузером и сервисом это не получается.

Я пытался вернуть совершенно новый объект:

 UserClientInfo uci = new UserClientInfo();

Это работает и возвращает XML с простым объектом.


Я что-то не так делаю?

Есть ли какие-то ограничения услуг, о которых я должен знать?

Есть ли какой-нибудь журнал, где я мог видеть, что не так?

Спасибо за любой ответ.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2012

Проблема была в сложных частях этого сложного объекта.Решением было преобразовать его в DTO.

0 голосов
/ 04 апреля 2012

Есть ли какой-нибудь журнал, где я мог видеть, что не так?

Вы можете добавить WCF logging в ваш файл web.config.Затем вы можете использовать S ervice Trace Viewer Tool для чтения / мониторинга.

<system.diagnostics>
<trace autoflush="true" />
<sources>
        <source name="System.ServiceModel" 
                switchValue="Information, ActivityTracing"
                propagateActivity="true">
        <listeners>
           <add name="sdt" 
               type="System.Diagnostics.XmlWriterTraceListener" 
               initializeData= "SdrConfigExample.e2e" />
        </listeners>
     </source>
</sources>
</system.diagnostics>
...