Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF REST+POST из Silverlight / 9 сообщений из 9, страница 1 из 1
30.05.2009, 19:48
    #36017298
S_A_V_e
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
Здравствуйте.

Пытаюсь разобраться с WCF REST. Для запросов GET всё получилось. Но вот с POST проблемы... Приведу для начала код клиента и сервиса:

WCF сервис:

Интерфейс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
[ServiceContract]    
    public interface IWCFService
    {        

        // TODO: Add your service operations here

        // Вызывается методом GET
        [OperationContract]
        [WebGet]
        int DoWork();

        // Вызывается методом POST
        [OperationContract]
        [WebInvoke(UriTemplate = "DoWork1")]
        string DoWork1(SampleItem item);
}


Реализация интерфейса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class WCFService : IWCFService
    {        

        
        // Этот метод через GET вызывается (можно прямо из браузера проверить)
        public int DoWork()
        {
            
            return 10;

        }
        // До вызова этого метода с клиента не доходит (через POST)
        public string DoWork1(SampleItem item)
        {
            return item.Value;
        }
}

Клиент (Silverlight)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void Page_Loaded(object sender, RoutedEventArgs e)
        {
            WebClient client = new WebClient();

            Uri uri = new Uri("http://localhost/REST.WCF/WCFService.svc/DoWork1");            

            client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
            client.Encoding = Encoding.UTF8;
            string content = "<SampleItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Value>Orange</Value> </SampleItem>";
            client.Headers[HttpRequestHeader.ContentType] = "text/xml";
            client.UploadStringAsync(uri, "POST", content);
}

Класс SampleItem:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
[DataContract]
    public class SampleItem
    {
        string sValue;
        [DataMember]
        public string Value 
        {
            get { return sValue; }
            set { sValue = value; }
        }
    }

web.config
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
<system.serviceModel>
    
    <services>
      <service behaviorConfiguration="REST.WCF.WCFServiceBehavior" name="REST.WCF.WCFService">        
        <endpoint address="" binding="webHttpBinding" behaviorConfiguration="webBehavior"  contract="REST.WCF.IWCFService" >
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    
    <behaviors>
      
      <endpointBehaviors>        
        <behavior name="webBehavior">
          <webHttp/>        
      </behavior>
      </endpointBehaviors>
      

      <serviceBehaviors>
        
        <behavior name="REST.WCF.WCFServiceBehavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"  />
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>    
    
  </system.serviceModel>

С файлом clientaccesspolicy.xml то же всё в порядке.

При вызове сервиса DoWork1 методом POST возникает Exception с сообщением "The remote server returned an error: NotFound". Причём DoWork методом GET вызывается с того же сервиса.

Подскажите пожалуйста где же ошибка ? Перекопал весь инет , но никаких особых отличий от своего кода в примерах не нашел...
...
Рейтинг: 0 / 0
01.06.2009, 17:58
    #36019753
S_A_V_e
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
Кое что прояснилось... частично даже заработало.
Попробовал сделать так:
В интерфейс добавил метод

Код: plaintext
1.
2.
3.
4.
5.
[OperationContract]
        [WebInvoke(Method = "POST",
        BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml, UriTemplate = "/SayHello")]
        string SayHello(string name);
реализация:

Код: plaintext
1.
2.
3.
4.
public string SayHello(string name) 
        {
            return name;
        }
На клиенте Content-Type поменял и сделал вызов метода

Код: plaintext
1.
2.
3.
4.
5.
Uri uri = new Uri("http://home/REST.WCF/WCFService.svc/SayHello");
...
client.Headers[HttpRequestHeader.ContentType] = "application/xml; charset=utf-8";
string content = "<string xmlns=\"http://schemas.microsoft.com/2003/10/Serialization/\">Foo</string>";
client.UploadStringAsync(uri, "POST", content);

Вызов прошел и данные вернулись на клиент. Так что думаю с конфигом и привязками всё в порядке.Но передать XML по прежнему не получается. Т.е. скорее всего вопрос в том как привильно написать xml для запроса что бы сериализатор его понял.

При попытке передать в запросе xml
Код: plaintext
1.
string content = "<SampleItem xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Value>Orange</Value></SampleItem>";

сервер возвращает 400 Bad Request
...
Рейтинг: 0 / 0
02.06.2009, 02:08
    #36020301
Roman S. Golubin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
S_A_V_e,

так пробовал?

Код: plaintext
string content = "<myns:SampleItem xmlns:myns=\"uri:myns\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";
...
Рейтинг: 0 / 0
02.06.2009, 11:15
    #36020722
S_A_V_e
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
Попробовал такие варианты:
Код: plaintext
1.
2.
3.
4.
5.
string content = "<myns:SampleItem xmlns:myns=\"http://home/REST.WCF/WCFService.svc\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";

string content = "<myns:SampleItem xmlns:myns=\"http://home/REST.WCF\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";

string content = "<myns:SampleItem xmlns:myns=\"REST.WCF\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><myns:Value>Orange</myns:Value></myns:SampleItem>";

Но результат тот же.
...
Рейтинг: 0 / 0
29.07.2009, 13:09
    #36115380
S_A_V_e
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
Проблема решена. Вот решение:
Интерфейс:
Код: plaintext
1.
2.
3.
4.
5.
6.
[OperationContract]
        [WebInvoke(Method = "POST",
        BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml, UriTemplate = "/GetSampleItem1")]
        SampleItem GetSampleItem1(SampleItem item);

Реализация интерфейса:
Код: plaintext
1.
2.
3.
4.
public SampleItem GetSampleItem1(SampleItem item) 
        {
            return item;
        }
Код клиента:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void UsePOST() 
        {
 WebClient client = new WebClient();
            Uri uri = new Uri("http://home/REST.WCF/WCFService.svc/GetSampleItem1");
            client.UploadStringCompleted += new UploadStringCompletedEventHandler(client_UploadStringCompleted);
            client.Encoding = Encoding.UTF8;            
            
            string content = "<SampleItem xmlns=\"http://schemas.datacontract.org/2004/07/REST.WCF\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\"><Value>qwerty</Value></SampleItem>";
            client.Headers[HttpRequestHeader.ContentType] = "application/xml; charset=utf-8";
            
            client.UploadStringAsync(uri, "POST", content);
        }

void client_UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)
        {
            // Получение ответа сервера при вызове методом POST 
            txtResult.Text = e.Result;
        }

Проблема была в формате XML используемого для сериализации объекта. Подсмотреть правильный формат удалось вернув объект с сервера.
...
Рейтинг: 0 / 0
22.01.2010, 19:14
    #36426136
RegisteredUser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
а можно приложить сюда проект целиком
...
Рейтинг: 0 / 0
02.02.2010, 16:04
    #36444910
S_A_V_e
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
Т.к. не первый раз просят исходники тестового проекта , прилагаю архив с проектом.
...
Рейтинг: 0 / 0
02.02.2010, 16:07
    #36444920
bured
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
S_A_V_e,

tnx
...
Рейтинг: 0 / 0
26.02.2010, 09:26
    #36489371
guest2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WCF REST+POST из Silverlight
Добавить в конфиг wcf-сервиса
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "wcf.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
и смотреть в файле wcf.svclog что происходит.
...
Рейтинг: 0 / 0
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF REST+POST из Silverlight / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]