Jump to content
Sign in to follow this  
Helio13

WCF Service

Recommended Posts

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

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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."

Share this post


Link to post
Share on other 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?

Edited by Helio13

Share this post


Link to post
Share on other 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.

Edited by Rui Carlos

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Edited by Flinger

Share this post


Link to post
Share on other 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?

Edited by Rui Carlos

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.