Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Helio13

WCF Service

Mensagens Recomendadas

Helio13

Boas pessoal.

Estou aqui com um problema, que nao estou a conseguir resolver...

Estou a fazer um site pessoal em HTML5, em que estou a colocar uma opção para enviar um mail...só que essa opção tem que ser trata numa linguagem server-side. Então estava a querer fazer em C#, em que envia os dados do mail, como (name, subject, message) por post para o C# e depois ai tratar a questão de enviar o mail.

A minha duvida é como no C# obter os dados que passo por post da minha aplicação em HTML5 e Javascript?

Tenho que fazer um WCF? Estou a utilizar o visual studio 2012, com a 4,5

Alguém me pode ajudar?

Obrigado

Cumprimentos

Hélio Miranda

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

A minha questão não era como fazer o envio do mail no C# mas como pegar os dados que passo no "post" da outra aplicação client para o server

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pikax

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Eu tenho o seguinte no C# WCF a correr

Service1..svc.cs

namespace Teste
{
   public class Service1 : IService1
   {
    public string GetData()
    {
	    string getdata = "hello";
	    return string.Format("You entered" + getdata);
    }
    public string GetDataName(string Name)
    {
	    return string.Format("You entered" + Name);
    }
   }
}

no IService1.cs

namespace Teste
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[serviceContract]
public interface IService1
{
	[OperationContract]
	[WebInvoke(Method = "POST", UriTemplate = "GetData", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
	string GetData();
	[OperationContract]
	[WebInvoke(Method = "POST", UriTemplate = "GetDataName", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
	string GetDataName(string Name);
}
}

Na minha aplicação cliente tenho:

$("#Button1").click(
	function ()
	{
		$.ajax(
		{
			type: "POST",
			url: "http://localhost:1117/Service1.svc/GetDataName",
			data: '{"Name": "John"}',
			dataType: 'json',
			contentType: "application/json; charset=utf-8",
			crossdomain: true,
			success: function (data) {
				alert(data);
			},
			error: function (xhr, status, error) {
				alert("failed " + error);
			}
		})
   });

Mas não esta a funcionar...não dá nada

Alguém me consegue dizer o que estou a fazer mal?

Editado por Helio13

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Porque estás a dizer ao endpoint que deve receber uma string, mas estás a passar um objecto que ele não conhece... (O Json com o nome.)

Cria um datacontract, e usa a serialização automática:

using System.runtime.Serialization;
[DataContract]
public class Dados
{
[DataMember(Name="Name")]
public string nome;
}

e usa um objecto desse tipo no endpoint em vez da string:

[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "GetDataName", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string GetDataName(Dados Name);

ps: Não sei se não precisarás de especificar a serialização do json:

using System.Runtime.Serialization.Json

Desculpa, há aqui uma coisa que não entendi... É suposto o webservice devolver a string "You entered" + Name ao cliente? é que pelo que estou a ver, não tratas da serialização em lugar nenhum, e na declaração do endpoint estás a dizer que ele devolve json.

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

Ok, fiz como disseste, mas agora em vez de fazer o "post" ele esta me a fazer um "options", parece me que nao esta a definir bem o content-type

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Flinger

Isso pode ser o pedido mal montado do lado do cliente.

Como não sei trabalhar com ajax, não te posso ajudar muito, mas posso-te dar umas dicas para fazeres debug ao serviço:

Usa o Fiddlerpara fazeres debug aos pedidos. Ele permite-te fazer um pedido directamente ao serviço (constrois o pedido no próprio fidler e ele mostra-te a resposta do servidor), e permite-te fazer de proxy entre o cliente e o serviço, podendo assim analisar o pedido do clliente e a resposta do servidor.

Editado por Flinger

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Helio13

A parte do Javascript já está correcta, e faz o post, tudo ok...

Mas está alguma coisa mal do lado do C#, pois quando faço o post ele dá me o seguinte erro:

failed Cannot process the message because the content type 'application/json; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.

O que eu tenho no C# é o seguinte

Service1.svc.cs:

namespace Teste
{
public class Service1 : IService1
{
	public string GetData()
	{
		string getdata = "hello";
		return string.Format("You entered" + getdata);
	}
	public string GetDataName(string Name)
	{
		return string.Format("You entered" + Name);
	}
}
}

IService1.cs:

namespace Teste
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[serviceContract]
public interface IService1
{
	[OperationContract]
	[WebInvoke(Method = "POST", UriTemplate = "GetData", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
	string GetData();
	[OperationContract]
	[WebInvoke(Method = "POST", UriTemplate = "GetDataName", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
	string GetDataName(string Name);

}
}

Alguém me sabe dizer o que pode estar mal?

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.