Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf 服务引用的正确url是什么?_Wcf_Jquery_Asp.net Mvc 4 - Fatal编程技术网

Wcf 服务引用的正确url是什么?

Wcf 服务引用的正确url是什么?,wcf,jquery,asp.net-mvc-4,Wcf,Jquery,Asp.net Mvc 4,我有两个项目,一个是WCF服务,就是在文本框中说一个文本/句子 public class Service1 : IService1 { public string RunTts(string text) { using (SpeechSynthesizer synth = new SpeechSynthesizer()) { // Configure the audio output. synth.

我有两个项目,一个是WCF服务,就是在文本框中说一个文本/句子

public class Service1 : IService1
{
    public string RunTts(string text)
    {
        using (SpeechSynthesizer synth = new SpeechSynthesizer())
        {
            // Configure the audio output. 
            synth.SetOutputToDefaultAudioDevice();
            synth.Speak(text);
            return "";
        }
    }
}
然后我在第二个项目的_Layout.cshtml页面中用ajax调用它,这是asp.net mvc

<script type="text/javascript">
    function ttsFunction() {
        serviceUrl = "Service1.svc/RunTts";

        $.ajax({
            type: "POST",
            url: serviceUrl,
            data: '{"text": "' + $('#speak').val() + '"}',
            contentType: "text/xml; charset=utf-8",
            dataType: "text/xml",
            error: function (xhr,status,error) {
                console.log("Status: " + status); // got "error"
                console.log("Error: " + error);   // got "Not Found"
                console.log("xhr: " + xhr.readyState); // got "4"
            },
            statusCode: {
                404: function() {
                    console.log("page not found"); // got 
                }
            }
        });
    }
</script>
因为我得到了404错误,所以我认为url是错误的。请查看文件的结构,我想web引用称为“ServiceReference1”。

如屏幕截图所示,该服务未托管在web应用程序中。您不能直接从客户端访问web应用程序外部托管的此类服务,因为您违反了限制。它是信任的基本概念之一,web安全基于信任,例如,对NIST的保护—您不能发送跨域AJAX请求。这本质上是说,如果内容来自一个网站,例如。https://bank.ny.com 被授予访问系统上资源的权限,则来自该站点的任何内容都将共享这些权限,而来自其他站点的内容将共享这些权限https://nsa.ny.com 通常必须单独授予权限,术语来源是使用域名、应用层协议和端口号定义的

尽管如此,您至少有4种解决方案:

首先-通过中间控制器层与您的服务对话。这样做意味着由svcutil.exe生成代理类,这是通过使用Visual Studio添加服务引用完成的。与此客户端的通信如下所示:

public class TtsController
{
    public JsonResult RunTts(string text)
    {                        
        using(var client = new ServiceReference1.Service1Client())
        {
            var response = client.RunTts(text);
            return Json(response);
...
JavaScript端应该使用这样一个URL:var-serviceUrl=/Tts/RunTts以及传递给AJAX请求的适当JSON数据,我将进一步介绍

第二,直接与服务人员交谈。如果要直接与服务通信,必须在web应用程序中承载此服务。应遵循正确的WCF配置以支持RESTful服务:

对于RESTful端点,您应该使用的绑定是WebHttpBinding以及适当的行为。另外,对于许多RESTful服务(WebServiceHostFactory),也有无配置的体验。您的.svc文件应如下所示:

顺便说一句:如果您将.svc文件放在应用程序中的不同目录下,请分别修改URL和路由以忽略

您的代码需要一些额外的修复:

如果要以JSON格式发送消息,请正确指定dataType和contentType参数:

$.ajax({
    url: serviceUrl,
    type: "POST",
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    ...
不要手动构造JSON字符串,因为这可能会导致进一步的解析错误-请使用转换器,例如:

var data = new Object();
data.text = $('#speak').val();
var jsonString = JSON.stringify(data);

$.ajax({
    ...
    data: jsonString,
    ...
为您的服务提供其他声明性信息:

routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]        
    string RunTts(string text);
...
从项目中删除服务引用。您不需要它,因为这里没有使用中间控制器

第三,外观和可用于克服原产地政策限制。但是您不能使用JSONP进行POST,因为它只是创建了一个元素来获取数据,这必须通过GET请求来完成。JSONP解决方案不使用XmlHttpRequest对象,因此它不是理解的标准方式中的AJAX请求,但内容仍然是动态访问的——对最终用户来说没有区别

$.ajax({
    url: serviceUrl,
    dataType: "jsonp",
    contentType: "application/json; charset=utf-8",
    data: data,
    ...

[OperationContract]         
[WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate="RunTts?text={text}")]
public string RunTts(string text);
允许跨域请求的RESTful WCF配置:


第四-。在现代浏览器中通过填充实现JSON。

如屏幕截图所示,该服务不在web应用程序中托管。您不能直接从客户端访问web应用程序外部托管的此类服务,因为您违反了限制。它是信任的基本概念之一,web安全基于信任,例如,对NIST的保护—您不能发送跨域AJAX请求。这本质上是说,如果内容来自一个网站,例如。https://bank.ny.com 被授予访问系统上资源的权限,则来自该站点的任何内容都将共享这些权限,而来自其他站点的内容将共享这些权限https://nsa.ny.com 通常必须单独授予权限,术语来源是使用域名、应用层协议和端口号定义的

尽管如此,您至少有4种解决方案:

首先-通过中间控制器层与您的服务对话。这样做意味着由svcutil.exe生成代理类,这是通过使用Visual Studio添加服务引用完成的。与此客户端的通信如下所示:

public class TtsController
{
    public JsonResult RunTts(string text)
    {                        
        using(var client = new ServiceReference1.Service1Client())
        {
            var response = client.RunTts(text);
            return Json(response);
...
JavaScript端应该使用这样一个URL:var-serviceUrl=/Tts/RunTts以及传递给AJAX请求的适当JSON数据,我将进一步介绍

第二,直接与服务人员交谈。如果要直接与服务通信,必须在web应用程序中承载此服务。正确的WCF配置 应遵循定量配给,以支持RESTful服务:

对于RESTful端点,您应该使用的绑定是WebHttpBinding以及适当的行为。另外,对于许多RESTful服务(WebServiceHostFactory),也有无配置的体验。您的.svc文件应如下所示:

顺便说一句:如果您将.svc文件放在应用程序中的不同目录下,请分别修改URL和路由以忽略

您的代码需要一些额外的修复:

如果要以JSON格式发送消息,请正确指定dataType和contentType参数:

$.ajax({
    url: serviceUrl,
    type: "POST",
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    ...
不要手动构造JSON字符串,因为这可能会导致进一步的解析错误-请使用转换器,例如:

var data = new Object();
data.text = $('#speak').val();
var jsonString = JSON.stringify(data);

$.ajax({
    ...
    data: jsonString,
    ...
为您的服务提供其他声明性信息:

routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]        
    string RunTts(string text);
...
从项目中删除服务引用。您不需要它,因为这里没有使用中间控制器

第三,外观和可用于克服原产地政策限制。但是您不能使用JSONP进行POST,因为它只是创建了一个元素来获取数据,这必须通过GET请求来完成。JSONP解决方案不使用XmlHttpRequest对象,因此它不是理解的标准方式中的AJAX请求,但内容仍然是动态访问的——对最终用户来说没有区别

$.ajax({
    url: serviceUrl,
    dataType: "jsonp",
    contentType: "application/json; charset=utf-8",
    data: data,
    ...

[OperationContract]         
[WebGet(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate="RunTts?text={text}")]
public string RunTts(string text);
允许跨域请求的RESTful WCF配置:



第四-。在现代浏览器中通过填充实现JSON。

是否要构建一个有声服务器?一旦您在IIS中部署此服务,它将不会执行我认为您希望它执行的操作。不,我不想构建一个会说话的服务器。为什么我在localhost中失败了?我没有响应WCF部分,我不知道那里出了什么问题,尽管我猜是你编的URL Service1.svc/RunTts,它是SOAP绑定吗?但我的意思是,你们试图从WCF服务中合成语音。这可能适用于您的开发计算机,但一旦您将其部署到IIS,您或您网站的访问者将听到任何声音。仅供参考,这是一个服务引用,而不是web引用。是否要构建一个对话服务器?一旦您在IIS中部署此服务,它将不会执行我认为您希望它执行的操作。不,我不想构建一个会说话的服务器。为什么我在localhost中失败了?我没有响应WCF部分,我不知道那里出了什么问题,尽管我猜是你编的URL Service1.svc/RunTts,它是SOAP绑定吗?但我的意思是,你们试图从WCF服务中合成语音。这可能在您的开发机器上起作用,但一旦您将其部署到IIS,您或您网站的访问者将听到任何声音。仅供参考,这是服务引用,不是web引用。仍然错误,全部错误。我是否应该将basicHttpsBinding更改为其他内容。我认为应该自动更改,因为我在服务中添加了REST属性。您现在遇到了什么错误?顺便说一句,我编辑了答案以添加更多信息。让我在问题中添加一些要点。请看。好的,我用了第二种方法。我删除了服务引用并启动了服务项目。然后调试我的mvc项目实例,错误:NetworkError:400错误请求-。我在这两个web.config中都没有找到端点。我认为这个问题可能与违反同源策略限制有关,因为您无法发送跨域AJAX请求。JSONPSO:,MSDN:可以用来克服这个问题。如果我是你的话,我会尝试现在就看一遍,因为我没有其他想法。这项服务是我自己创建的,只有几行。我没有任何限制,实际上我根本不知道如何添加它们。仍然是错误的,都是错误的。我是否应该将basicHttpsBinding更改为其他内容。我认为应该自动更改,因为我在服务中添加了REST属性。您现在遇到了什么错误?顺便说一句,我编辑了答案以添加更多信息。让我在问题中添加一些要点。请看。好的,我用了第二种方法。我删除了服务引用并启动了服务项目。然后调试我的mvc项目实例,错误:NetworkError:400错误请求-。我在这两个web.config中都没有找到端点。我认为这个问题可能与违反同源策略限制有关,因为您无法发送跨域AJAX请求。JSONPSO:,MSDN:可以用来克服这个问题。如果我是你的话,我会尝试现在就看一遍,因为我没有其他想法。这项服务是我自己创建的,只有几行。我没有任何限制,实际上我根本不知道如何添加它们。