作者:michael | 来源:互联网 | 2023-05-17 11:55
如何使用花生壳,让我在别的电脑上也能得到这个程序 的服务,请高手帮忙回答下,用的是VB.NET做的
42 个解决方案
你把承载服务的那台电脑的wcf所用的端口打开,在防火墙里面设置就行。
然后找花生壳弄一个二级域名或者域名,将你的服务地址改为这个域名下的,花生壳的软件会自动把这个域名解析到你的动态公网IP上。
我XP的防火墙都是关闭的,那么默认情况下,8731端口是打开的吗,还是另外要设置
如果防火墙是关闭的,也没用路由器,那就不用设置了.
哎,一谈到端口映射我就焉了,办公室的路由器我能做的了吗,而且怎么做也是问题
也不一定,我见过一个公司(名字忘了)可以为局域网内的机器做动态域名解析,不需要设置路由器,原理估计就是先进行vpn连接,然后由他们公司的服务器转发。你可以问问花生壳现在是否有这种方案。
WCF服务端配置文件中,设置为LOCALHOST:8731 和 设置为 10.50.179.224:8731,假如这个是主机的IP,这2种设置有什么区别?
10.50.179.224是局域网地址吧?对公网来说没区别,都不能用.这两种地址在socket下会有区别,在wcf下,对局域网来说没区别。
我问的意思在于 服务端是不是只在乎端口,不在乎IP吧,就算是该主机的IP是公网固定IP,那么服务端写上 LOCALHOST:8731, 客户端也可以通过 10.50.179.224:8731 ,假如这个是那个主机的公网IP,客户端也可以通过这个IP和端口 访问这个服务吧
我的家里是 有线通网络,配合无线路由器,自动获取IP上网的那种,如何设置花生壳端口映射?
有线通就是有线电视那种同轴电缆是吧?那个我猜测也是局域网的吧,没有独立公网地址,比办公室还难弄.你通过网络连接查看一下是否有独立的公网地址.
先直接连到电脑上,不经过路由器,通过电脑网络连接看下地址.
哎,昏头了,本来好不容易做了个WCF数据库服务,想在外网用用瞧的,白辛苦了,恐怕我这回事搞不好了,还有别的方法没?购买花生壳什么服务可以轻松做到外网访问?
花生壳如果没有vpn方案,能解决的问题就必须符合两个条件,
1、有独立的公网地址,或者可以设置具有独立公网地址的路由器的端口映射;
2、这个公网地址必须是动态的,因为如果不是动态的,就不需要花生壳了,可以直接使用。
找个用ADSL拨号的宽带试试看。
再问个问题,这玩意,就是DNS,啥回事,服务端中需要有这个吗?客户端需要有吗,客户端好像我怎么加布进去
我看默认生成的WCF代码中,有也 这个,只不过值是 LOCALHOST,所以想问问,这个东西需要设置吗,有什么用吗
还想问个技术问题,在默认生成的代码配置中,好像一次传输的数量是很小的,那么可以在这种模式下用STREAM传输大文件吗,还是必须改为绑定来传输大文件?
我做wcf没设置过这个。我猜想这个东西的作用可能是把服务地址通过这个指定的DNS服务解析到网卡上,因为在wcf服务中写公网地址、局域网地址、localhost都是可以的。socket要让外网访问,就必须写网卡的局域网地址。瞎猜的,具体你查查吧。
我知道可以设置这个来传输大文件,只是想问,如果在限制传输大文件的情况下,可以通过用 STREAM的方法来传大文件吗,这个不是一次传一点点,我看网上代码,传输大文件都是用 STREAM方法的,在这种方法里,一次传输的量不大吧,那么这个时候还是要设置maxReceivedMessageSize吗?
那么大文件如何分包传输?那种传输STREAM的方法,不属于分包传输方法吗?
public void HelloStreamed(string source, string destination)
{
try
{
var proxy = new MessageSvc.Streamed.StreamedClient();
var sr = new System.IO.FileStream(
source, System.IO.FileMode.Open);
proxy.UploadFile(destination + Path.GetFileName(source), sr);
sr.Close();
proxy.Close();
MessageBox.Show("上传成功");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
}
}
需要在你路由器上做端口映射的设定,和花生壳没有直接关系
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
namespace WCF.ServiceLib.Message
{
/**////
/// 消息契约(定义与 SOAP 消息相对应的强类型类)
///
[MessageContract]
public class FileWrapper
{
/**////
/// 指定数据成员为 SOAP 消息头
///
[MessageHeader]
public string FilePath;
/**////
/// 指定将成员序列化为 SOAP 正文中的元素
///
[MessageBodyMember]
public Stream FileData;
}
/**////
/// IStreamed接口
///
[ServiceContract]
public interface IStreamed
{
/**////
/// 上传文件
///
///
/// 1、支持数据流传输的绑定有:BasicHttpBinding、NetTcpBinding 和 NetNamedPipeBinding
/// 2、流数据类型必须是可序列化的 Stream 或 MemoryStream
// /3、传递时消息体(Message Body)中不能包含其他数据,即参数中只能有一个System.ServiceModel.MessageBodyMember
/**////
/// WCF.ServiceLib.Message.FileWrapper
[OperationContract]
void UploadFile(FileWrapper fileWrapper);
}
}
Streamed.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.IO;
namespace WCF.ServiceLib.Message
{
/**////
/// IStreamed类
///
public class Streamed : IStreamed
{
/**////
/// 上传文件
///
/// WCF.ServiceLib.Message.FileWrapper
public void UploadFile(FileWrapper fileWrapper)
{
var sourceStream = fileWrapper.FileData;
var targetStream = new FileStream(fileWrapper.FilePath,
FileMode.Create,
FileAccess.Write,
FileShare.None);
var buffer = new byte[4096];
var count = 0;
while ((count = sourceStream.Read(buffer, 0, buffer.Length)) > 0)
{
targetStream.Write(buffer, 0, count);
}
targetStream.Close();
sourceStream.Close();
}
}
}
我看这个没分包,那个UploadFile执行了一次,一次性把sr都传了.
他这个如果不封包,那么还不如我直接传个大的STRING过去算了,我觉得这个和传一个大的STRING字符串绝对不同,他传了一个STREAM对象,然后对方可以慢慢读取,那么每次一定传输的数据量不大,我猜测的,如果没区别,我一次性的在自己的端都读成STRING,再传过去算了
string和stream还是有区别的,string传输时,wcf实际上还要序列化为byte[],而stream本身就是可变的长度可变的byte[]数组,更有利于传输。
你这么说,难道在传输的过程中没分包?我看起来好像是每次最多传输4096 BYTE吧,至于收到后怎么管理,就不是我要问的事了,我就是问,这个过程,和我在发送端直接把所有的都存入一个字符串变量,然后当参数传过去,有什么不同?
你的方法只执行了一次,就肯定没有分包,4096时节收到整个stream后分包卸到文件里的。
你直接传输string完全可以的。
再问个问题,WCF服务中,每次实例的创建是要耗时间的,有哪些方法可以预想把一些数据固化,不随实例创建而创建,用PUBLIC SHARED 创建一个数组,可以吗?
WCF中,用DATASET的GETXML方法得到的字符串,和自己用XML组合,得到的字符串,哪个更小?
有什么好方法把这些STATIC 数组 设置初始值?