Основанный на REST WCF запрос GET для получения исходного XML - PullRequest
0 голосов
/ 03 января 2012

Я пытаюсь добавить метод GET к моей службе на основе WCF REST и получить к нему доступ через класс WebRequest из клиентского приложения Silverlight 3.

Я получаю сообщение об ошибке Удаленный сервер вернул ошибку: NotFound. , которая, насколько я понимаю, может быть просто общей ошибкой для любой ошибки 500, возникшей на сервере.

Контракт на эксплуатацию WCF:

[OperationContract, WebGet(UriTemplate = "path/{id}")]
Stream Get(string id);

Выполнение операции:

public Stream Get(string id)
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml; charset=utf-8";

    return new MemoryStream(Encoding.UTF8.GetBytes("<xml><id>1</id><name>Some Name</name></xml>));
}

Код клиента, который выдает исключение:

HttpWebRequest webRequest = WebRequest.CreateHttp("http://domain.com/my-service.svc/path/1");

webRequest.BeginGetResponse(
    x =>
    {
        try
        {
            using (WebResponse webResponse = webRequest.EndGetResponse(x)) <--Exception thrown here
            using (Stream stream = webResponse.GetResponseStream())
            {
               //do stuff here...eventually.
            }
        }
        catch (Exception ex)
        {
        }
    },
    null);

Я подозреваю, что это как-то связано с типом возврата, а также пытался вернуть XmlElement безрезультатно. Я действительно в тупике, есть идеи, что я могу делать не так?

Обратите внимание, что я могу успешно использовать метод с помощью Fiddler и веб-браузера.

Ответы [ 3 ]

1 голос
/ 03 января 2012

Попробуйте вставить приведенный ниже код в файл web.config (измените имя файла в атрибуте initializeData соответствующим образом.

Если вы используете полный IIS, а не Casini или IIS Express (я использую последний), обязательно поместите файл журнала где-нибудь, где у вашего веб-приложения есть права на запись). Это заставит WCF сгенерировать довольно подробный файл журнала. Я нашел журнал очень удобным.


<system.diagnostics>
  <sources>
    <source name="System.ServiceModel"
            switchValue="Information, ActivityTracing"
            propagateActivity="true">
      <listeners>
        <add name="traceListener"
            type="System.Diagnostics.XmlWriterTraceListener"
            initializeData= "c:\temp\WEBTraces.log" />
      </listeners>
    </source>
  </sources>
</system.diagnostics>

1 голос
/ 03 января 2012

Вот еще одна вещь, которую нужно проверить: является ли domain.com тем же доменным именем, с которого запущено ваше приложение silverlight (например, ваше SL-приложение запускается как localhost / xx, а ваш вызов веб-службы идет на domain.com?

По соображениям безопасности Silverlight не будет выполнять междоменные вызовы веб-службы, если только вызываемый домен не предоставит ему разрешение (аналогично Flash). В этом случае вам потребуется файл clientaccesspolicy.xml.

Вы можете прочитать об этом здесь: http://weblogs.asp.net/jgalloway/archive/2008/12/12/silverlight-crossdomain-access-workarounds.aspx

Здесь есть видео: http://www.silverlight.net/learn/data-networking/introduction-to-data-and-networking/how-to-use-cross-domain-policy-files-with-silverlight

Здесь есть несколько помощников: http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx

0 голосов
/ 03 января 2012

NotFound должно означать 404, а не 500. Ошибка 404 может быть вызвана неправильным URI.

Uri resturi = new Uri(String.Format("http://{0}:8080/MyService/", hostname)); // http
WebHttpBinding rest = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); // WebHttpSecurityMode.Transport for ssl
host.AddServiceEndpoint(typeof(IMyService), rest, resturi);

В приведенном выше примере кода ваш сервис будет доступен через http://host:8080/MyService/path/1

...